0

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

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=>$value 设为数组元素和 NAME/TIME 的数组,而是将 $key 设为 NAME 或 TIME,这当然是错误的。

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

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

还是我的方法完全错误?如果是这样,请赐教?谢谢!

4

2 回答 2

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...
于 2013-08-01T15:34:58.470 回答
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);
}

我所做的只是检查: 是 STOP 一个数组,然后我什么都不改变,它是 的一个实例吗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);
}
于 2013-08-01T15:35:58.147 回答