Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当对象中没有数组时,如何使用foreach?_Php_Arrays_Object_Foreach - Fatal编程技术网

Php 当对象中没有数组时,如何使用foreach?

Php 当对象中没有数组时,如何使用foreach?,php,arrays,object,foreach,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

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

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"
      }
    }
  }
}
  ["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"
    }
  }
}
但是,当STOP不包含元素数组时,上面的PHP代码导致了一个问题,如下所示:

  ["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"
      }
    }
  }
}
  ["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作为数组元素和名称/时间的数组,而是将$key作为名称或时间,这当然是错误的

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

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


还是我的方法完全错了?如果是这样,请告诉我好吗?谢谢

您正在处理不同类型的结构。您应该确保
$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...

你在处理不同类型的结构。您应该确保
$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...

如果
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);
}

如果
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);
}

手册里有线索。foreach仅适用于数组和对象如果您没有要迭代的数组或对象,则不要使用foreach您是否从数据库获得结果。。。我问的原因是,你可以使用一些肮脏的黑客来操纵查询。你有没有试过你的代码?因为它应该很好用。所有对象都可以使用foreach循环进行迭代,即使是自定义对象(尽管您只能看到
public
properties)。此外,如果您对数组更熟悉:
$arr=(array)$someObject是可能的(将对象投射到阵列)@Anigel感谢您的回复。但它不会每次从我正在执行的SOAP请求返回相同的输出,因此我不知道它是数组还是仅仅是一个指向单个对象的指针(缺少更好的术语)。您仍然可以使用if(is_array())来确定这是否是数组,如果不是数组,则使用foreach或执行其他操作。相关线索在手册中。foreach仅适用于数组和对象如果您没有要迭代的数组或对象,则不要使用foreach您是否从数据库获得结果。。。我问的原因是,你可以使用一些肮脏的黑客来操纵查询。你有没有试过你的代码?因为它应该很好用。所有对象都可以使用foreach循环进行迭代,即使是自定义对象(尽管您只能看到
public
properties)。此外,如果您对数组更熟悉:
$arr=(array)$someObject是可能的(将对象投射到阵列)@Anigel感谢您的回复。但它并不是每次从我正在执行的SOAP请求返回相同的输出,因此我不知道它是数组还是仅仅是指向单个对象的指针(缺少更好的术语)。您仍然可以使用if(is_array())来确定这是否是数组,如果不是,则使用foreach或执行其他操作。