如果对象中没有数组,如何使用foreach?

时间:2013-08-01 15:24:22

标签: php arrays object foreach

我成功地使用了这个,所以我想:

foreach ($trip->STOPS->STOP as $key=>$value) {

大部分时间数据都是这样的:

  ["STOPS"]=>
  object(stdClass)#247 (1) {
    ["STOP"]=>
    array(4) {
      [0]=>
      object(stdClass)#248 (2) {
        ["NAME"]=>
        string(11) "Short Hills"
        ["TIME"]=>
        string(20) "7/30/2013 6:38:24 AM"
      }
      [1]=>
      object(stdClass)#249 (2) {
        ["NAME"]=>
        string(8) "Millburn"
        ["TIME"]=>
        string(20) "7/30/2013 6:41:24 AM"
      }
      [2]=>
      object(stdClass)#250 (2) {
        ["NAME"]=>
        string(19) "Newark Broad Street"
        ["TIME"]=>
        string(20) "7/30/2013 6:53:00 AM"
      }
      [3]=>
      object(stdClass)#251 (2) {
        ["NAME"]=>
        string(21) "New York Penn Station"
        ["TIME"]=>
        string(20) "7/30/2013 7:13:00 AM"
      }
    }
  }
}

但是,当STOP不包含元素数组时,上面的PHP代码会导致问题,如下所示:

  ["STOPS"]=>
  object(stdClass)#286 (1) {
    ["STOP"]=>
    object(stdClass)#287 (2) {
      ["NAME"]=>
      string(21) "New York Penn Station"
      ["TIME"]=>
      string(20) "7/30/2013 8:13:00 AM"
    }
  }
}

正如你可能猜到的那样,而不是将$ key => $值作为数组元素和NAME / TIME的数组,而是将$ key设为NAME或TIME,这是错误的当然。

如何正确使用此foreach方法,而无需检查foreach $ trip-> STOPS-> STOP是否包含数组或多个元素?

此数据的来源来自SOAP请求,该请求以JSON格式返回。

或者我的方法完全错了?如果是的话,请赐教我?谢谢!

2 个答案:

答案 0 :(得分:2)

你正在处理不同类型的结构。您应确保$trip->STOPS->STOP是一个数组,或者将其设为数组。像这样:

if (is_array($trip->STOPS->STOP)) {
    $stopArray = $trip->STOPS->STOP;
} else {
    // wrap it in array with single element
    $stopArray = array( $trip->STOPS->STOP );
}
foreach ($stopArray as $key=>$value) {
    // your code...

答案 1 :(得分:1)

如果STOP属性的值 一个数组,包含多个stdClass个实例,或一个stdClass个实例,您只需检查那,并重新分配财产:

if ($trip->STOPS->STOP instanceof stdClass)
{
    $trip->STOPS->STOP = array($trip->STOPS->STOP);
}
foreach($trip->STOPS->STOP as $key => $object)
{
    echo $key, implode(',', (array) $object);
}

我所做的只是检查:停止数组,然后我什么都不做,是stdClass的实例,我创建了一个包装数组,包含了非常客观,因此$key的价值永远是它所需要的。

但是,既然你要循环遍历那些对象,一个一个地对待它们(我猜),那么创建一个函数要好得多:

function todoWhatYouDoInLoop(stdClass $object)
{
    //do stuff
    //in case the objects are altered:
    return $object;
}

您可以这样使用:

if (is_array($trip->STOPS->STOP))
{
    $trip->STOPS->STOP = array_map('todoWhatYouDoInLoop', $trip->STOPS->STOP);
}
else
{
    $trip->STOPS->STOP = todoWhatYouDoInLoop($trip->STOPS->STOP);
}