2009-06-04 144 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; 
//... 
}