【问题标题】:Parsing JSON in for each with increment PHP使用增量 PHP 为每个解析 JSON
【发布时间】:2016-12-01 22:29:00
【问题描述】:

我正在尝试将 json 文件解析为 for each 循环。问题是数据嵌套在具有递增数字的容器中,这是一个问题,因为我不能只抓取 foreach 中的每个值。我花了一段时间试图找到一种方法来让它发挥作用,但我却一无所获。有什么想法吗?

这是整理好的 json 文件,所以你可以明白我的意思 - http://www.jsoneditoronline.org/?url=http://ergast.com/api/f1/current/last/results.json

我正在尝试获取诸如 [number] 之类的值,但我也想获取更深层次的值,例如 [Driver][code]

        <?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'];
            }
        ?>

【问题讨论】:

  • json 并不重要。您已经对其进行了解码,因此它是一个普通的旧 PHP 数据结构,您可以像任何其他 PHP 数据结构一样迭代/处理它。如果您有嵌套结构,则需要多个嵌套循环。
  • 你使用了 '$a 变量错误试试这个:$nextRaceDate = $nextRace['MRData']['RaceTable']['Races']['0']['Results'][$a ]

标签: php json loops parsing foreach


【解决方案1】:

在解码json 时,无需将对象展平为关联array。只是按照它应该使用的方式使用它。

$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

【讨论】:

    【解决方案2】:

    您的代码几乎是正确的,当您尝试$a++ 时,您做错了。删除$a = 0,你就不需要了。

    到这里你是对的

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

    接下来要做的就是这个

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

    所以,在我的代码中,您在 Results 处停止,然后,您想要遍历所有结果,从 0 到 X,第一个 foreach 将执行此操作,您必须访问 $value为了那个原因。所以,添加另一个foreach 来遍历$value 拥有的所有内容。

    你去吧,我添加了一个print_r 来表明你正在迭代你想要的东西。

    【讨论】:

      【解决方案3】:

      问题在于如何访问嵌套数组中的元素。 这里有一种方法:

      $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'];
              // ...
          }
      }
      

      我不知道你的对象是从哪里来的,但是,如果你确定每次比赛都能得到,第一个循环可以被抑制并使用快捷方式:

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

      您的问题是索引必须是整数,因为数组是非关联的。给出一个字符串,php 正在寻找键 '$a++',而不是在 $a 中具有值的索引。

      【讨论】:

        【解决方案4】:

        如果你只需要第一场比赛的号码,试试这个方法

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

        也许您需要在“Races”属性中进行迭代 如果您需要全部,请尝试这种方式:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          • 2013-04-15
          • 2018-01-27
          • 2018-05-14
          • 1970-01-01
          相关资源
          最近更新 更多