PHP JSON对象嵌套循环数据语法

时间:2013-09-26 19:48:06

标签: php json object for-loop

我正在尝试遍历一些JSON数据并提取特定值。这是JSON数据和部分工作代码。

$jsondata = '
[
  {
  "id" : "421356",
  "trip_update" : {
    "trip" : {
      "trip_id" : "421356",
      "start_time" : "12:05:00",
      "start_date" : "20130926",
      "route_id" : "15"
    },
    "stop_time_update" : {
       "stop_sequence" :70,
      "departure" : {
        "delay" : 240,
        "time" : 1380215057
      },
      "stop_id" : "6090"
    },
    "stop_time_update" : {
       "stop_sequence" :71,
      "departure" : {
        "delay" : 240,
        "time" : 1380215075
      },
      "stop_id" : "6095"
    }
  }
}]';
$result = json_decode($jsondata);

foreach($result as $value) {
  echo "trip_id: ".$value->trip_update->trip->trip_id;
  if (gettype($value->trip_update ) == "object") {
    foreach($value->trip_update as $item) {
       echo " - stop_sequence: ".$item->stop_sequence;
    }
  }
}

我可以在'trip_update-> trip'下获得第一级数据。但是'trip_update'中也可以有任意数量的'stop_time_update'数据。由于此数据与trip_update数据有关,因此我需要遍历它并将其关联起来。

最终目标是将此数据保存到数据库(未在代码中显示),因此为了清楚起见,这将是我想在此示例中保存的简化的2行数据库数据:

trip_id,stop_sequence
421356,70
421356,71

源数据中可以有任意数量的stop_sequences。

以下是您编辑或处理的代码的交互式链接: http://sandbox.onlinephpfunctions.com/code/f21ca8928da7de3e9fb351edb075d0a446906937

4 个答案:

答案 0 :(得分:2)

如果您编写自己的解析器或使用带回调的流解析器,您可能会获得更好的结果。这是一个PHP implementation这样的解析器,可用于回调。因此,不是将整个JSON数据读入内存,解析器将以块的形式读取数据,并在新对象启动或读入属性时通知您的“侦听器类”。通过这样做,您应该获得单独的回调事件对于每个stop_time_update属性而不是解析数组中的一个值。

非常类似于SAX对于XML。

答案 1 :(得分:1)

你应该重写你的JSON - 你有多个具有相同名称的键,尝试print_r($result)看看我在说什么 - PHP会一次又一次地覆盖“stop_time_update”键,你将能够仅访问最后一个条目。相反,你应该像这样组织你的JSON:

[
  {
  "id" : "421356",
  "trip_update" : {
    "trip" : {
      "trip_id" : "421356",
      "start_time" : "12:05:00",
      "start_date" : "20130926",
      "route_id" : "15"
    },
    "stop_time_update" : [{
       "stop_sequence" :70,
      "departure" : {
        "delay" : 240,
        "time" : 1380215057
      },
      "stop_id" : "6090"
    }, {
       "stop_sequence" :71,
      "departure" : {
        "delay" : 240,
        "time" : 1380215075
      },
      "stop_id" : "6095"
    }]
  }
}]

然后您将能够像这样迭代您的数据:

foreach($result[0]->trip_update->stop_time_update as $update)
{
     $time = $update->departure->time;
     ...
}

如果你不能改变数据结构,那么可能对你有帮助的是一个PULL解析器 - 一个不返回解析数据结构的解析器,但允许你使用数据流 - 这样你就可以迭代每个节点。我设法找到的唯一一个是PHP的扩展:

https://github.com/shevron/ext-jsonreader

检查使用部分。

答案 2 :(得分:1)

JSON响应无效,因为它包含重复的密钥,但JSON没有allow duplicate keys

您应该联系您尝试从此处回复此服务的服务。

如果您有一个有效的JSON响应,那么您可以使用返回对象或数组的json_decode函数对其进行解码(取决于第二个参数);

你不能使用JSON parser,因为它会因为相同的键而覆盖第一个元素。唯一合适的解决方案是询问是谁创建了“JSON”来修复他的代码,要么使用数组,要么使用具有唯一键的对象。

另一种选择是编写自己的解码器函数来解析它

答案 3 :(得分:1)

您好,也许您可​​以更改名称。

function next_update($coincidencias){
$replace=$coincidencias[0].$GLOBALS["json_stop_time_update"]++;
return $replace;
}
$result= preg_replace_callback("/stop_time_update/","next_update",$jsondata);
$result = json_decode($result);