我成功地使用了这个,所以我想:
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格式返回。
或者我的方法完全错了?如果是的话,请赐教我?谢谢!
答案 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);
}