2014-12-05 68 views
1

我有这个问题,API响应我的DEPARTURESEGMENT有时只包含一个对象,有时包含一个对象数组。根据具体情况,我似乎在我的foreach循环中需要不同的逻辑。如何迭代JSON属性不知道它是否是数组?

响应答:

{ 
    "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) { 

有没有一种方法来编写循环failsafe是否DEPARTURESEGMENT是一个对象的数组还是只有一个对象(括号[]是唯一的区别json结构的权利?)或者我必须以某种方式测试并首先查看DEPARTURESEGMENT是否为数组,并根据结果分派到两个不同的循环?

回答

1

你有几个方法可以帮助你:

在你的情况解码,你可能会被罚款执行以下操作:

if (is_object($entry)) { 
    handleObject($entry); 
} elseif (is_array($entry) && count($entry)) { 
    foreach ($entry as $e) { 
     handleObject($e); 
    } 
} 
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) 
    ... 
+0

这实际上就是我要做的,如果它是在PHP中的标准方法。不过,我觉得这个功能在我需要的每个对象/控制器中都包含这个功能太麻烦了。所以我看到了你的方法的天才,但这次我选择了不同的解决方案。 – 2014-12-05 10:58:31

相关问题