2009-06-04 7 views
14

J'utilise le code suivant pour obtenir des données d'un site Web à l'aide de Soap.Objet stdClass et boucles 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>"; 

Voici un exemple de sortie:

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 
         ) 

       ) 

     ) 

) 

Si seulement 1 résultat est retourné, je peux tout simplement faire quelque chose comme ceci:

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

Alors, comment pourrais-je aller sur travailler avec plusieurs résultats?

Toute aide serait grandement appréciée.

Répondre

37

Il est un tableau, vous pouvez passer en boucle à l'aide facilement foreach:

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

Cependant, il est intéressant de noter que PHP de SoapClient par défaut semble renvoyer des tableaux comme un tableau PHP seulement quand il y a plus de une valeur dans le tableau - s'il n'y a qu'une seule valeur, vous obtiendrez juste cette valeur (non contenue dans un tableau). Un moyen facile autour de ceci est d'utiliser l'option SOAP_SINGLE_ELEMENT_ARRAYS dans le constructeur SoapClient; cela empêchera ce comportement et vous assurera toujours des tableaux.

+3

passé la journée d'hier perplexe sur cette chose. Je n'avais aucune idée de l'indicateur "SOAP_SINGLE_ELEMENT_ARRAYS"; Merci pour ça. – nickmjones

+0

pour les personnes qui ne savent pas comment ajouter l'option: '$ client = new SoapClient ('http://www.example.com', array ('features' => SOAP_SINGLE_ELEMENT_ARRAYS,))' –

0

Itérer sur le tableau ?! :-)

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

Mon avis sur la question est de simplement toujours vous assurer que vous avez un tableau de messages, même si elle est un tableau de 1. De cette façon, vous ne dupliquer aucun traitement.

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

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

Vous devez spécifier votre clé d'objet SMARTmessage Arrays.

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

ou

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