如何迭代JSON属性,不知道它是否是数组?

时间:2014-12-05 10:33:17

标签: php arrays json loops

我遇到这个问题,其中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是否是数组,然后根据结果调度到两个不同的循环?

3 个答案:

答案 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