Array-Werte berechnen innerhalb einer foreach-Schleife

loddarmattheus

Erfahrenes Mitglied
Hallo Leute,
ich steh mal wieder auf dem Schlauch und bräuchte bitte Eure Hilfe bzw. zumindest einen Denkansatz.
Ich habe ein Array mit zwei Werten: Einem Timestamp (der genau einem Tag entspricht und chronologisch sortiert ist) und einem Kurswert an genau diesem Tag.
Wenn ich die Schleife durchlaufen lasse, dann soll im Ergebnis der Kursunterschied zwischen dem fünften Tag und dem ersten Tag errechnet werden.

PHP:
<?php

$kurstabelle = array (
    "    1367107200    "    =>    "    103    "    ,
    "    1367193600    "    =>    "    110    "    ,
    "    1367280000    "    =>    "    106    "    ,
    "    1367366400    "    =>    "    89    "    ,
    "    1367452800    "    =>    "    81    "    ,
    "    1367539200    "    =>    "    75    "    ,
    "    1367625600    "    =>    "    86    "    ,
    "    1367712000    "    =>    "    88    "    ,
    "    1367798400    "    =>    "    86    "    ,
    "    1367884800    "    =>    "    84    "    ,
    "    1367971200    "    =>    "    87    "    ,
    "    1368057600    "    =>    "    86    "    ,
    "    1368144000    "    =>    "    90    "    ,
    "    1368230400    "    =>    "    89    "    ,
    "    1368316800    "    =>    "    88    "    ,
    "    1368403200    "    =>    "    91    "    ,
    "    1368489600    "    =>    "    86    "    ,
    "    1368576000    "    =>    "    88    "    ,
    "    1368662400    "    =>    "    92    "    ,
    "    1368748800    "    =>    "    96    "   

);

foreach ($kurstabelle as $timestamp => $wert)
    {
   echo "Der Kurs am " . $timestamp . " ist " . $wert . "<br />\n";
   }

In meinem Beispiel soll also Tag 1 zu Tag 5 errechnet werden (103 zu 81, also - 22); Tag 2 zu Tag 6 (110 zu 75, also -35); Tag 3 zu Tag 7 (106 zu 86, also -20) usw. bis zum Ende des Arrays.

Hat jemand eine Idee für die Umsetzung?
Danke vorab.
Loddar
 
Lösung
So auf die schnelle. geht ev. auch eleganter

Eine Schleife über alle bis kurz vor Schluss
Dann mittels des Indexes mit dem Wert in 4 Tagen zugreifen.
PHP:
//Tag 5 - Tag 1 = 4
$delta = 4;
//Die Datums extrahieren
$dates = array_keys($kurstabelle);
//Die Preise extrahieren. Ist ein gleich grosser Array wie $dates
$rates = array_values($kurstabelle);

//mittels index iterieren. Dabei schauen, dass die letzten $delta Tage nicht mehr dabei sind
for ($i=0; $i < count($kurstabelle) - $delta; $i++){
    //Die Differenz zwischen den Preisen bei $i und $i+$delta berechnen
    $diff = $rates[$i+$delta] - $rates[$i];
    echo "{$dates[$i]} -> {$dates[$i+$delta]}: {$diff}<br />";
}
Ausgabe:
Code:
    1367107200     ->     1367452800    : -22...
So auf die schnelle. geht ev. auch eleganter

Eine Schleife über alle bis kurz vor Schluss
Dann mittels des Indexes mit dem Wert in 4 Tagen zugreifen.
PHP:
//Tag 5 - Tag 1 = 4
$delta = 4;
//Die Datums extrahieren
$dates = array_keys($kurstabelle);
//Die Preise extrahieren. Ist ein gleich grosser Array wie $dates
$rates = array_values($kurstabelle);

//mittels index iterieren. Dabei schauen, dass die letzten $delta Tage nicht mehr dabei sind
for ($i=0; $i < count($kurstabelle) - $delta; $i++){
    //Die Differenz zwischen den Preisen bei $i und $i+$delta berechnen
    $diff = $rates[$i+$delta] - $rates[$i];
    echo "{$dates[$i]} -> {$dates[$i+$delta]}: {$diff}<br />";
}
Ausgabe:
Code:
    1367107200     ->     1367452800    : -22
    1367193600     ->     1367539200    : -35
    1367280000     ->     1367625600    : -20
    1367366400     ->     1367712000    : -1
    1367452800     ->     1367798400    : 5
    1367539200     ->     1367884800    : 9
    1367625600     ->     1367971200    : 1
    1367712000     ->     1368057600    : -2
    1367798400     ->     1368144000    : 4
    1367884800     ->     1368230400    : 5
    1367971200     ->     1368316800    : 1
    1368057600     ->     1368403200    : 5
    1368144000     ->     1368489600    : -4
    1368230400     ->     1368576000    : -1
    1368316800     ->     1368662400    : 4
    1368403200     ->     1368748800    : 5
 
Lösung
Kann ich nochmal nachhaken? Wenn ich dann die "negativen" Ergebnisse innerhalb der if zählen will mittels count, dann schmeißt er mir eine Fehlermeldung:
PHP:
//mittels index iterieren. Dabei schauen, dass die letzten $delta Tage nicht mehr dabei sind
for ($i=0; $i < count($kurstabelle) - $delta; $i++){
    //Die Differenz zwischen den Preisen bei $i und $i+$delta berechnen
    $diff = $rates[$i+$delta] - $rates[$i];
    if($diff < 0)
        {           
        $fazit = 'CRASH';
        count($diff);
        }
        else $fazit = 'LONG';
    echo "{$dates[$i]} -> {$dates[$i+$delta]}: {$diff} {$fazit}<br />";

Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, int given in...
 
Da scheint $kurstabelle oder$diff kein Array zu sein, warum auch immer. Wobei die Zeile
PHP:
count($diff);
etwas sinnlos erscheint.

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Und in dem Fall mal überlegen, was $diff sein könnte. Du rechenst einen Wert. Also ist das käumlich ein Array.
Aber shau doch selber mal $diff mitteös var_dump() an.
 
Ja leider ist mir schon klar, dass es int(-22) sind, aber damit lässt sich doch nicht rechnen.
Ich überlege daher, die Ergebnisse wieder in ein Array zu packen, damit ich mittels count dann wieder summieren, subtrahieren etc. kann.
 
Hab es selbst hinbekommen, nicht sehr elegant, aber es funktioniert. Habe die Ergebnisse einfach durch sich selbst geteilt, was ja bekanntlich immer eins ist und diese dann hochgezählt.
Danke
 

Neue Beiträge

Zurück