2009-06-04 21 views
14

Ich verwende den folgenden Code, um Daten von einer Website mit Soap zu erhalten.StdClass Objekt und foreach Schleifen

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

Hier ist ein Beispiel für die Ausgabe:

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 
         ) 

       ) 

     ) 

) 

Wenn nur 1 Ergebnis zurückgegeben wird, kann ich einfach etwas tun:

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

Wie würde ich mich über Arbeiten mit mehreren Ergebnissen?

Jede Hilfe würde sehr geschätzt werden.

Antwort

37

Es ist ein Array, so können Sie es Schleife über leicht mit foreach:

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

Allerdings ist es erwähnenswert, dass die PHP-SoapClient standardmäßig angezeigt wird nur Arrays als PHP-Array zurück, wenn es mehr als ein Wert im Array - wenn es nur einen Wert gibt, erhalten Sie nur diesen Wert (nicht in einem Array enthalten). Ein einfacher Weg, dies zu umgehen, ist die Verwendung der Option SOAP_SINGLE_ELEMENT_ARRAYS im SoapClient Konstruktor; Dies verhindert dieses Verhalten und stellt sicher, dass Sie immer Arrays erhalten.

+3

der Tag gestern Verbrauchte verwirrt diese sehr Sache vorbei. Ich hatte keine Ahnung von der "SOAP_SINGLE_ELEMENT_ARRAYS" Flagge; Dank dafür. – nickmjones

+0

für Leute, die nicht wissen, wie man die Option hinzufügt: '$ client = new SoapClient ('http://www.example.com', Array ('features' => SOAP_SINGLE_ELEMENT_ARRAYS,));' –

0

Iterieren über das Array ?! :-)

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

drauf Mein nehmen ist einfach immer sicherstellen, dass Sie eine Reihe von Nachrichten, auch wenn es eine Reihe von 1. Auf diese Weise ist Sie keine Bearbeitung duplizieren.

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

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

Sie müssen Ihren SMSIncomingMessage-Array-Objektschlüssel angeben.

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

oder

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