我遇到这个问题,其中API使用DEPARTURESEGMENT响应我,有时只包含一个对象,有时包含一个对象数组。根据它的情况,我似乎需要在foreach循环中使用不同的逻辑。
回应A:
{
"getdeparturesresult":{
"departuresegment":[{
"departure":{
"location":{
"@id":"7461018",
"@x":"12.523958",
"@y":"57.938402",
"name":"Noltorps centrum"
},
"datetime":"2014-12-04 23:05"
},
"direction":"Alingsås station",
"segmentid":{
"mot":{
"@displaytype":"B",
"@type":"BLT",
"#text":"Buss"
},
"carrier":{
"name":"Västtrafik",
"url":"http://www.vasttrafik.se/",
"id":"279",
"number":"1"
}
}
},
{
"departure":{
"location":{
"@id":"7461018",
"@x":"12.523958",
"@y":"57.938402",
"name":"Noltorps centrum"
},
"datetime":"2014-12-04 23:05"
},
"direction":"Alingsås station",
"segmentid":{
"mot":{
"@displaytype":"B",
"@type":"BLT",
"#text":"Buss"
},
"carrier":{
"name":"Västtrafik",
"url":"http://www.vasttrafik.se/",
"id":"279",
"number":"1"
}
}
}
]
}
}
使用此循环:
foreach ($apiData->getdeparturesresult->departuresegment as $m) {
虽然这个回应B:
{
"getdeparturesresult":{
"departuresegment":{
"departure":{
"location":{
"@id":"7461018",
"@x":"12.523958",
"@y":"57.938402",
"name":"Noltorps centrum"
},
"datetime":"2014-12-04 23:05"
},
"direction":"Alingsås station",
"segmentid":{
"mot":{
"@displaytype":"B",
"@type":"BLT",
"#text":"Buss"
},
"carrier":{
"name":"Västtrafik",
"url":"http://www.vasttrafik.se/",
"id":"279",
"number":"1"
}
}
}
}
}
需要这样的循环(否则会抛出错误):
foreach ($apiData->getdeparturesresult as $m) {
有没有办法为DEPARTURESEGMENT是一个对象数组还是只有一个对象编写循环失败保护(括号[]是json右边结构的唯一区别吗?)或者我必须以某种方式测试和先看看DEPARTURESEGMENT是否是数组,然后根据结果调度到两个不同的循环?
答案 0 :(得分:1)
您可以使用以下几种方法来帮助您:
在您的情况下,通过执行以下操作可能会没问题:
if (is_object($entry)) {
handleObject($entry);
} elseif (is_array($entry) && count($entry)) {
foreach ($entry as $e) {
handleObject($e);
}
}
答案 1 :(得分:1)
我在标准曲目中有这个小功能:
function iter($x) {
if(is_array($x))
return $x;
if(is_object($x)) {
if($x instanceof \Iterator)
return $x;
if(method_exists($x, 'getIterator'))
return $x->getIterator();
return get_object_vars($x);
}
return array($x);
}
通过这种方式,您可以使用foreach
的任何变量,而无需事先检查它:
foreach(iter($whatever) as $item)
...
答案 2 :(得分:0)
如何使用is_array检查它是否为数组? 我在这里做了一个简单的例子 - http://codepad.org/WNjbIPZF