Problem beim Ausgeben eines mehrdimensionalen assoziativen Arrays

loddarmattheus

Erfahrenes Mitglied
Hallo Leute,
ich steh mal wieder auf dem Schlauch. Für die Kenner unter Euch sicherlich ein Kinderspiel.

Eine API-Abfrage erzeugt mir mit folgendem var_dump
PHP:
$foo = new Alpha;
$alle =    $foo->returnTrades($link);

echo "<pre>";
var_dump($alle);
echo "</pre>";

diese Array-Ausgabe:

Code:
array(2) {
  ["Meta Data"]=>
  array(6) {
    ["1. Information"]=>
    string(56) "Intraday (5min) open, high, low, close prices and volume"
    ["2. Symbol"]=>
    string(4) "MSFT"
    ["3. Last Refreshed"]=>
    string(19) "2018-08-20 15:55:00"
    ["4. Interval"]=>
    string(4) "5min"
    ["5. Output Size"]=>
    string(9) "Full size"
    ["6. Time Zone"]=>
    string(10) "US/Eastern"
  }
  ["Time Series (5min)"]=>
  array(1170) {
    ["2018-08-20 15:55:00"]=>
    array(5) {
      ["1. open"]=>
      string(8) "106.8550"
      ["2. high"]=>
      string(8) "106.8900"
      ["3. low"]=>
      string(8) "106.8000"
      ["4. close"]=>
      string(8) "106.8700"
      ["5. volume"]=>
      string(6) "833098"
    }
    ["2018-08-20 15:50:00"]=>
    array(5) {
      ["1. open"]=>
      string(8) "107.0200"
      ["2. high"]=>
      string(8) "107.0200"
      ["3. low"]=>
      string(8) "106.8400"
      ["4. close"]=>
      string(8) "106.8500"
      ["5. volume"]=>
      string(6) "580106"
    }
    ["2018-08-20 15:45:00"]=>
    array(5) {
      ["1. open"]=>
      string(8) "107.0400"
      ["2. high"]=>
      string(8) "107.0500"
      ["3. low"]=>
      string(8) "107.0100"
      ["4. close"]=>
      string(8) "107.0200"
      ["5. volume"]=>
      string(6) "175719"
    }.....

Ziel ist es, aus dem zweiten Array ("Time Series (5min)") die Werte zu extrahieren, und zwar in folgender Ausgabeform:

2018-08-20 15:55:00 106.8550 106.8900 106.8000 106.8700 833098
2018-08-20 15:50:00 107.0200 107.0200 106.8400 106.8500 580106
....usw.

Doch meine Versuche mit der foreach geben immer Fehler aus:

Code:
foreach($alle as $row){
        echo $row['Time Series (5min)']." ".$row['1. open']." ".$row['2.high']." ".$row['3.low']." ".$row['4. close']." ".$row['5.volume']."<br>"; 
        }

Was mache ich falsch?
 
Dieses Array ist mehrfach verschachtelt, das musst Du bei der Ausgabe berücksichtigen. Dies sollte es tun:
PHP:
    foreach ($alle['Time Series (5min)'] as $key=>$item) {
        echo $key;
        foreach ($item as $item2) {
            echo ' ' . $item2;
        }
        echo '<br>';
    }
 
Darf ich vielleicht doch nochmal nachfragen, denn ich kann die einzelnen Elemente des Array (1. open,
2. high ...usw.) ja nicht direkt ansprechen.

Also $item2['1.open'] mag er irgendwie nicht.

Hintergrund: Die Daten sollen in eine MySQL eingetragen werden und ich benötige nicht alle Werte des Array.
 
Doch, die kannst Du ohne weiteres ansprechen, wenn Du im foreach auch den Schlüssel definierst:
PHP:
    foreach ($alle['Time Series (5min)'] as $key=>$item) {
        echo $key;
        foreach ($item as $key2=>$item2) {
            // jetzt steht in $key2 z. B. "1.open" zur Verfügung
            echo ' ' . $item2;
        }
        echo '<br>';
    }
 
Sorry ich habe mich verkehrt ausgedrückt. key2 zeigt mir zwar schön die "Überschriften" wie 1.open, 2.high usw. an, aber ich brauche die direkt ansprechbaren Werte der jeweiligen Überschriften. So etwas wie $key2['1.open'] in etwa , wie man es von ganz normalen Arrays kennt.

1.open: 106.8550 2.high: 106.8900 usw....

Hintergrund: manche Werte muss ich vor dem Eintrag in die Datenbank noch bearbeiten.
 
Dann musst Du in der äußeren Schleife ansetzen:
PHP:
    foreach ($alle['Time Series (5min)'] as $key=>$item) {
        echo $key;
        // Auf dieser Stufe ist $item ein normales Array
        // und Du kannst Du so auf die Werte zugreifen:
        $wert = $item['1.open'];
        foreach ($item as $key2=>$item2) {
            // $key2: Der Schlüssel, z. B. "1.open"
            // $item2: Der Wert, z. B. 106.8550
            echo ' ' . $key . ': ' . $item2;
        }
        echo '<br>';
    }
Hoffe, dies ist, was Du brauchst.
 
Hallo und guten Morgen,

dieser Code schmeisst mir leider folgendes Ergebnis:
Code:
2018-08-21 15:55:00
Notice: Undefined index: 1.open in D:\xampp\htdocs\Coin\Alphavantage\price_test2.php on line 28
2018-08-21 15:55:00: 106.0050 2018-08-21 15:55:00: 106.0900 2018-08-21 15:55:00: 105.9700 2018-08-21 15:55:00: 105.9900 2018-08-21 15:55:00: 1240915
2018-08-21 15:50:00
Notice: Undefined index: 1.open in D:\xampp\htdocs\Coin\Alphavantage\price_test2.php on line 28
2018-08-21 15:50:00: 106.0000 2018-08-21 15:50:00: 106.0600 2018-08-21 15:50:00: 105.8500 2018-08-21 15:50:00: 106.0080 2018-08-21 15:50:00: 681968
2018-08-21 15:45:00....

Line 28: $wert = $item['1.open'];
 
Zurück