2009-06-04 18 views
14

Korzystam z następującego kodu, aby uzyskać dane z witryny za pomocą Soap.Obiektu obiektu i fored stdClass

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

Oto próbka wyjścia:

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 
         ) 

       ) 

     ) 

) 

Jeśli tylko 1 wynik jest zwracany, mogę po prostu zrobić coś takiego:

$reference = $result->GetIncomingMessagesResult->SMSIncomingMessage->Reference; 

Więc jak pójdę o działa z wieloma wynikami?

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

37

Jest tablicą, więc można pętli nad nim łatwo za pomocą foreach:

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

Jednak warto zauważyć, że pojawia PHP SoapClient domyślnie powrót tablic jako tablica PHP tylko wtedy, gdy istnieje więcej niż jedna wartość w tablicy - jeśli istnieje tylko jedna wartość, otrzymasz tę wartość (nie zawartą w tablicy). Łatwym sposobem obejścia tego problemu jest użycie opcji SOAP_SINGLE_ELEMENT_ARRAYS w konstruktorze SoapClient; to zapobiegnie temu zachowaniu i zapewni, że zawsze otrzymasz tablice.

+3

spędzony dzień wczoraj zaskoczony przez tę samą rzecz. Nie miałem pojęcia o znaczniku "SOAP_SINGLE_ELEMENT_ARRAYS"; Dziękuję za to. – nickmjones

+0

dla osób, które nie wiedzą, jak dodać opcję: '$ client = new SoapClient ('http://www.example.com', array (" features "=> SOAP_SINGLE_ELEMENT_ARRAYS,));' –

0

Iteruj po tablicy ?! :-)

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

My się na to, aby po prostu zawsze upewnij się, że szereg komunikatów, nawet jeśli jest to tablica 1. W ten sposób nie powielać żadnej obróbki.

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

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

Musisz określić swój klucz obiektu tablic SMSIncomingMessage.

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

lub

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