【问题标题】:Loop through nested JSON with php使用 php 循环遍历嵌套的 JSON
【发布时间】:2015-01-17 07:24:17
【问题描述】:

我有一个结构如下的 json 文件:

[{
    "Item": {
        "name": "Item 1",
        "schedule": {
            "class": "Class",
            "uic": "UIC"
        },
        "days": "Mondays",
        "segment": {
            "branding": "A1",
            "location": [{
                "location_type": "L1",
                "time": "18:00"
            }, {
                "location_type": "L2",
                "time": "18:15"
            }, {
                "location_type": "L3",
                "time": "18:18"
            }]
        },
        "transaction": "Trans"
}
}, {        "Item": {
        "name": "Item 2",
        "schedule": {
            "class": "Class",
            "uic": "UIC"
        },
        "days": "Tuesdays",
        "segment": {
            "branding": "A2",
            "location": [{
                "location_type": "Lu1",
                "time": "19:00"
            }, {
                "location_type": "L2",
                "time": "19:15"
            }, {
                "location_type": "L3",
                "time": "19:18"
            }, {
                "location_type": "L4",
                "time": "19:25"
            }]
        },
        "transaction": "Trans"
    }
}]

我正在使用 php 的 json 解码来输出这些数据,但我不确定如何实现我想要的。我正在尝试将此数据作为每个项目的每个 location_type 值的新行,基本上列出每个项目的每个组合。

下面的例子本质上是我想要输出的:

Item 1, Class, UIC, Mondays, A1, L1, 18:00, Trans
Item 1, Class, UIC, Mondays, A1, L2, 18:15, Trans
Item 1, Class, UIC, Mondays, A1, L3, 18:17, Trans
Item 2, Class, UIC, Tuesdays, A2, L1, 19:00, Trans
Item 2, Class, UIC, Tuesdays, A2, L2, 19:15, Trans
Item 2, Class, UIC, Tuesdays, A2, L3, 19:17, Trans
Item 2, Class, UIC, Tuesdays, A2, L4, 19:25, Trans

我假设我需要深入到该位置,然后为每个项目循环遍历它,但是我的 php 是有限的,我找不到任何似乎可以实现这一点的东西。

谢谢。

【问题讨论】:

  • 你能分享你的尝试吗?
  • 我可能是错的,但您的 JSON 似乎不正确。这是一个内部有一个大对象的数组。其中有两个属性,每个属性都有名称“项目”。这是不正确的。
  • @OlegDubas 你说得对,我已经更正了代码。

标签: php json nested


【解决方案1】:

如果你的 JSON 是正确的(但它不是),代码应该是这样的:

foreach($JSON as $item)
{
    $item = $item->Item; // because you changed the code

    for($i=0;$i<count($item->segment->location);$i++)
    {
        echo $item->name, ', ';
        echo $item->schedule->class. ', ';
        echo $item->schedule->uic. ', ';
        echo $item->days. ', ';
        echo $item->segment->branding. ', ';
        echo $item->segment->location[$i]->location_type. ', ';
        echo $item->segment->location[$i]->time. ', ';
        echo $item->segment->transaction. '<br>';
    }
}

【讨论】:

    【解决方案2】:

    假设你的 json 在变量 $json 上

    $array = json_decode($json);
    
    foreach ($array as $value) {
        foreach ($value->Item->segment->location as $loc) {
            echo sprintf('%s, %s, %s, %s, %s, %s, %s, %s <br>', 
                $value->Item->name,
                $value->Item->schedule->class,
                $value->Item->schedule->uic,
                $value->Item->days,
                $value->Item->segment->branding,
                $loc->location_type,
                $loc->time,
                $value->Item->transaction
            );
        }
    }
    

    这将输出

    Item 1, Class, UIC, Mondays, A1, L1, 18:00, Trans 
    Item 1, Class, UIC, Mondays, A1, L2, 18:15, Trans 
    Item 1, Class, UIC, Mondays, A1, L3, 18:18, Trans 
    Item 2, Class, UIC, Tuesdays, A2, Lu1, 19:00, Trans 
    Item 2, Class, UIC, Tuesdays, A2, L2, 19:15, Trans 
    Item 2, Class, UIC, Tuesdays, A2, L3, 19:18, Trans 
    Item 2, Class, UIC, Tuesdays, A2, L4, 19:25, Trans 
    

    【讨论】:

      【解决方案3】:
      <?php
          $input = '[
              {
                  "Item": {
                      "name": "Item 1",
                      "schedule": {
                          "class": "Class",
                          "uic": "UIC"
                      },
                      "days": "Mondays",
                      "segment": {
                          "branding": "A1",
                          "location": [
                              {
                                  "location_type": "L1",
                                  "time": "18:00"
                              },
                              {
                                  "location_type": "L2",
                                  "time": "18:15"
                              },
                              {
                                  "location_type": "L3",
                                  "time": "18:18"
                              }
                          ]
                      },
                      "transaction": "Trans"
                  }
              },
              {
                  "Item": {
                      "name": "Item 2",
                      "schedule": {
                          "class": "Class",
                          "uic": "UIC"
                      },
                      "days": "Tuesdays",
                      "segment": {
                          "branding": "A2",
                          "location": [
                              {
                                  "location_type": "Lu1",
                                  "time": "19:00"
                              },
                              {
                                  "location_type": "L2",
                                  "time": "19:15"
                              },
                              {
                                  "location_type": "L3",
                                  "time": "19:18"
                              },
                              {
                                  "location_type": "L4",
                                  "time": "19:25"
                              }
                          ]
                      },
                      "transaction": "Trans"
                  }
              }
          ]';
      
          $items = json_decode($input);
      
          foreach ($items as $item) {
              $item = $item->Item;
              for ($i = 0, $l = count($item->segment->location); $i < $l; $i++ ) {
                  echo $item->name . ", ";
                  echo $item->schedule->class . ", ";
                  echo $item->schedule->uic . ", ";
                  echo $item->days . ", ";
                  echo $item->segment->branding . ", ";
                  echo $item->segment->location[$i]->location_type . ", ";
                  echo $item->segment->location[$i]->time . ", ";
                  echo $item->transaction;
                  echo "<br/>";
              }
          }
      ?>
      

      【讨论】:

        【解决方案4】:
         $jsonStr = <<<JSON
        [{
            "Item": {
                "name": "Item 1",
                "schedule": {
                    "class": "Class",
                    "uic": "UIC"
                },
                "days": "Mondays",
                "segment": {
                    "branding": "A1",
                    "location": [{
                        "location_type": "L1",
                        "time": "18:00"
                    }, {
                        "location_type": "L2",
                        "time": "18:15"
                    }, {
                        "location_type": "L3",
                        "time": "18:18"
                    }]
                },
                "transaction": "Trans"
        }
        }, {        "Item": {
                "name": "Item 2",
                "schedule": {
                    "class": "Class",
                    "uic": "UIC"
                },
                "days": "Tuesdays",
                "segment": {
                    "branding": "A2",
                    "location": [{
                        "location_type": "Lu1",
                        "time": "19:00"
                    }, {
                        "location_type": "L2",
                        "time": "19:15"
                    }, {
                        "location_type": "L3",
                        "time": "19:18"
                    }, {
                        "location_type": "L4",
                        "time": "19:25"
                    }]
                },
                "transaction": "Trans"
            }
        }]
        JSON;
        
        $arr = json_decode($jsonStr);
        
        
        foreach($arr as $item)
        {
        
            $locations = $item->Item->segment->location;
            foreach($locations as $loc)
            {
                echo $item->Item->name, ', ';
                echo $item->Item->schedule->class. ', ';
                echo $item->Item->schedule->uic. ', ';
                echo $item->Item->days. ', ';
                echo $item->Item->segment->branding. ', ';
                echo $loc->location_type. ', ';
                echo $loc->time. ', ';
                echo $item->Item->transaction. '<br>';
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-11-17
          • 1970-01-01
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多