2016-07-27 11 views
1

Ich versuche, eine JSON-Datei in eine für jede Schleife zu analysieren. Das Problem ist, dass die Daten in Containern mit inkrementierten Zahlen verschachtelt sind, was ein Problem ist, da ich dann nicht einfach jeden Wert in der foreach erfassen kann. Ich habe eine Weile damit verbracht, einen Weg zu finden, wie ich das schaffen kann, und ich bin leer ausgegangen. Irgendeine Idee?Parsen von JSON für jedes mit Inkrement PHP

Hier wird die JSON-Datei, so können Sie aufräumte sehen, was ich meine - http://www.jsoneditoronline.org/?url=http://ergast.com/api/f1/current/last/results.json

Ich versuche, Werte wie [Zahl] zu bekommen, aber ich will auch tiefere Werte wie [Driver] [Code erhalten

]
 <?php 
      // get ergast json feed for next race 
      $url = "http://ergast.com/api/f1/current/last/results.json"; 
      // store array in $nextRace 
      $json = file_get_contents($url); 
      $nextRace = json_decode($json, TRUE); 

      $a = 0; 
      // get array for next race 
      // get date and figure out how many days remaining 
      $nextRaceDate = $nextRace['MRData']['RaceTable']['Races']['0']['Results'][' . $a++ . ']; 
      foreach ($nextRaceDate['data'] as $key=>$val) { 
       echo $val['number']; 
      } 
     ?> 
+1

die json ist nicht wirklich wichtig. Sie haben es entschlüsselt, also ist es eine einfache alte PHP-Datenstruktur, und Sie durchlaufen/verarbeiten sie wie jede andere PHP-Datenstruktur. Wenn Sie geschachtelte Strukturen haben, benötigen Sie mehrere verschachtelte Schleifen. –

+0

Sie verwenden die $ a Variable falsch versuchen Sie dies: '$ nextRaceDate = $ nextRace ['MRData'] ['RaceTable'] ['Rennen'] ['0'] ['Ergebnisse'] [$ a]' – cmnardi

Antwort

0

Während die json dekodiert wird, muss das Objekt nicht zu einem assoziativen array abgeflacht werden. Benutze es einfach wie es benutzt werden soll.

$nextRace = json_decode($json); 
$nextRaceDate = $nextRace->MRData->RaceTable->Races[0]->Results; 

foreach($nextRaceDate as $race){ 
    echo 'Race number : ' . $race->number . '<br>'; 
    echo 'Race Points : ' . $race->points. '<br>'; 
    echo '====================' . '<br>'; 
} 

CodePad Example

+1

Perfekt, danke! – Connor

0

Sie sind fast richtig mit Ihrem Code, tun Sie es falsch, wenn Sie die $a++ versuchen. Entfernen Sie die $a = 0, Sie werden es nicht brauchen.

Bis hier sind Sie richtig

$nextRaceDate = $nextRace['MRData']['RaceTable']['Races']['0']['Results'] 

Was haben Sie als nächstes zu tun ist dies

$nextRaceDate = $nextRace['MRData']['RaceTable']['Races']['0']['Results']; 
foreach($nextRaceDate as $key => $value){ 
    foreach($value as $key2 => $value2) 
     print_r($value2); 

Also, in meinem Code, Sie bei Results stoppen sind, und dann, möchten Sie iterieren über alle Ergebnisse, von 0 bis X, die erste foreach wird das tun, müssen Sie auf $value dafür zugreifen. Fügen Sie also einen weiteren foreach hinzu, um über den gesamten Inhalt zu iterieren, den $value hat.

Dort gehen Sie, fügte ich eine print_r hinzu, um Ihnen zu zeigen, dass Sie über das hinausgehen, was Sie wollten.

0

Das Problem besteht darin, wie Sie auf die Elemente im verschachtelten Array zugreifen. Hier ist ein Weg, es zu tun:

$mrData = json_decode($json, true)['MRData']; 

foreach($nextRace['RaceTable']['Races'] as $race) { 
    // Here you have access to race's informations 
    echo $race['raceName']; 
    echo $race['round']; 
    // ... 
    foreach($race['Results'] as $result) { 
     // And here to a result 
     echo $result['number']; 
     echo $result['position']; 
     // ... 
    } 
} 

Ich weiß nicht, wo die aus dem Objekt kommen, aber, wenn Sie sicher sind, dass Sie jedes Mal ein Rennen bekommen, könnte die erste Schleife unterdrückt und Verwendung wird die Abkürzung

$race = json_decode($json, true)['MRData']['RaceTable']['Races'][0]; 

Ihr Problem ist, dass der Index eine ganze Zahl sein muss, weil die Anordnung nicht assoziativ ist. Bei einem String suchte php nach dem Schlüssel '$ a ++' und nicht nach dem Index mit dem Wert in $ a.

0

Wenn Sie nur die Nummer des ersten Rennen benötigen, versuchen auf diese Weise

$a = 0; 
$nextRaceDate = $nextRace['MRData']['RaceTable']['Races']['0']['Results'][$a]; 
echo "\n".$nextRaceDate['number']; 

vielleicht brauchen Sie in der ‚Races‘ Attribut iterieren Wenn Sie alle brauchen, versuchen auf diese Weise:

$nextRaceDate = $nextRace['MRData']['RaceTable']['Races']; 
foreach ($nextRaceDate as $key => $val) { 
    foreach ($val['Results'] as $val2) { 
     echo "\nNUMBER " . $val2['number']; 
    } 
}