2009-06-04 45 views
14

Estoy usando el siguiente código para obtener datos de un sitio web utilizando Soap.stdClass object y foreach loops

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

Aquí es una muestra de la salida:

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 sólo se devuelve 1 resultado, simplemente me puedo hacer algo como esto:

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

Entonces, ¿cómo hago para trabajando con resultados múltiples?

Cualquier ayuda sería muy apreciada.

Respuesta

37

Es una matriz, por lo que se puede reproducir indefinidamente fácilmente usando foreach:

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

Sin embargo vale la pena señalar que de SoapClient por defecto PHP parece volver matrices como una matriz PHP sólo cuando hay más de un valor en la matriz: si solo hay un valor, obtendrá ese valor (no incluido dentro de una matriz). Una forma fácil de evitar esto es usar la opción SOAP_SINGLE_ELEMENT_ARRAYS en el constructor SoapClient; esto evitará este comportamiento y garantizará que siempre obtenga matrices.

+3

Pasamos el día de ayer interrogado sobre esto mismo. No tenía idea sobre el indicador "SOAP_SINGLE_ELEMENT_ARRAYS"; gracias por eso. – nickmjones

+0

para las personas que no saben cómo agregar la opción: '$ client = new SoapClient ('http://www.example.com', array ('features' => SOAP_SINGLE_ELEMENT_ARRAYS,));' –

0

¡Iterate sobre la matriz ?! :-)

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

Mi opinión sobre ella es hacer simplemente siempre asegurarse de que tiene una serie de mensajes, incluso si se trata de un conjunto de 1. De esta manera usted no duplicar ningún procesamiento.

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

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

necesita especificar su clave de objeto de matrices SMSIncomingMessage.

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

o

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