stdClass 对象和 foreach 循环
Posted
技术标签:
【中文标题】stdClass 对象和 foreach 循环【英文标题】:stdClass object and foreach loops 【发布时间】:2010-10-31 08:27:06 【问题描述】:我正在使用以下代码使用 Soap 从网站获取数据。
$client = new SoapClient('http://some.url.here');
class SMSParam
public $CellNumber;
public $AccountKey;
public $MessageCount;
public $MessageBody;
public $Reference;
$parameters = new SMSParam;
$parameters -> AccountKey = "$sms_key";
$parameters -> MessageCount = "25";
$Result = $client->GetIncomingMessages($parameters);
echo "<pre>";
print_r($Result);
echo "</pre>";
这是一个输出示例:
stdClass Object
(
[GetIncomingMessagesResult] => stdClass Object
(
[SMSIncomingMessage] => Array
(
[0] => stdClass Object
(
[OutgoingMessageID] => data
[Reference] => data
[MessageNumber] => data
[PhoneNumber] => data
[Message] => data
[ReceivedDate] => data
)
[1] => stdClass Object
(
[OutgoingMessageID] => data
[Reference] => data
[MessageNumber] => data
[PhoneNumber] => data
[Message] => data
[ReceivedDate] => data
)
[2] => stdClass Object
(
[OutgoingMessageID] => data
[Reference] => data
[MessageNumber] => data
[PhoneNumber] => data
[Message] => data
[ReceivedDate] => data
)
)
)
)
如果只返回 1 个结果,我可以简单地执行以下操作:
$reference = $result->GetIncomingMessagesResult->SMSIncomingMessage->Reference;
那么我将如何处理多个结果?
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:将对象转换为数组
$array = (array) json_decode(['TEST'=>true]);
【讨论】:
【参考方案2】:它是一个数组,因此您可以使用foreach
轻松循环它:
foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message)
echo $message->Reference;
然而值得注意的是,php 的 SoapClient
默认情况下,仅当数组中有多个值时才会将数组作为 PHP 数组返回 - 如果只有一个值,您将只获得该值(不包含在一个数组中)。解决此问题的一种简单方法是在SoapClient
构造函数中使用选项SOAP_SINGLE_ELEMENT_ARRAYS
;这将防止这种行为并确保您始终获得数组。
【讨论】:
昨天花了一天时间对这件事感到困惑。我不知道“SOAP_SINGLE_ELEMENT_ARRAYS”标志;谢谢你。 对于不知道如何添加选项的人:$client = new SoapClient('http://www.example.com', array('features' => SOAP_SINGLE_ELEMENT_ARRAYS,));
【参考方案3】:
您需要指定 SMSIncomingMessage 数组对象键。
$result->GetIncomingMessagesResult->SMSIncomingMessage[0]->Reference;
或
foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message)
$reference = $message[0]->Reference;
//...
【讨论】:
【参考方案4】:我的看法是始终确保你有一个消息数组,即使它是一个 1 的数组。这样你就不会重复任何处理。
$smsMessages = is_array( $result->GetIncomingMessagesResult->SMSIncomingMessage )
? $result->GetIncomingMessagesResult->SMSIncomingMessage
: array( $result->GetIncomingMessagesResult->SMSIncomingMessage );
foreach ( $smsMessages as $smsMessage )
echo $smsMessage->Reference;
【讨论】:
【参考方案5】:遍历数组?! :-)
foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message)
$reference = $message->Reference;
//...
【讨论】:
以上是关于stdClass 对象和 foreach 循环的主要内容,如果未能解决你的问题,请参考以下文章