2009-06-04 131 views
14

我正在使用以下代码从使用Soap的网站获取数据。stdClass对象和foreach循环

$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; 

那么我将如何去处理多个结果?

任何帮助将不胜感激。

回答

37

这是一个数组,这样你就可以遍历它很容易使用foreach

foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message) { 
    echo $message->Reference; 
} 

然而,值得注意的是,PHP默认的SoapClient似乎返回数组作为一个PHP数组时,才会有更多的比数组中的一个值 - 如果只有一个值,您将只获取该值(不包含在数组中)。一个简单的方法是在SoapClient构造函数中使用选项SOAP_SINGLE_ELEMENT_ARRAYS;这将防止这种行为,并确保你总是获得数组。

+3

昨天花了一天的疑惑过这事。我不知道“SOAP_SINGLE_ELEMENT_ARRAYS”标志;感谢那。 – nickmjones 2009-10-08 13:57:15

0

迭代阵列?! :-)

foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message) 
{ 
    $reference = $message->Reference; 
    //... 
} 
2

我它采取的是只始终确保你有消息数组,即使它的1数组这样,你不重复任何处理。

$smsMessages = is_array($result->GetIncomingMessagesResult->SMSIncomingMessage) 
    ? $result->GetIncomingMessagesResult->SMSIncomingMessage 
    : array($result->GetIncomingMessagesResult->SMSIncomingMessage); 

foreach ($smsMessages as $smsMessage) 
{ 
    echo $smsMessage->Reference; 
} 
2

您需要指定您的SMSIncomingMessage数组对象键。

$result->GetIncomingMessagesResult->SMSIncomingMessage[0]->Reference; 

foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message) 
{ 
$reference = $message[0]->Reference; 
//... 
}