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或执行其他操作。