Объект stdClass и петли foreach

Я использую следующий код для получения данных с сайта с помощью Soap.

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

Итак, как я могу работать с несколькими результатами?

Любая помощь будет принята с благодарностью.

Это массив, поэтому вы можете легко перебирать его с помощью foreach :

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

Однако стоит отметить, что SoapClient от PHP по умолчанию возвращают массивы как массив PHP только тогда, когда в массиве имеется более одного значения – если есть только одно значение, вы просто получите это значение (не содержащееся в массиве). SOAP_SINGLE_ELEMENT_ARRAYS способом использования этого параметра является использование SOAP_SINGLE_ELEMENT_ARRAYS в конструкторе SoapClient ; это предотвратит это поведение и гарантирует, что вы всегда получите массивы.

Я беру на себя обязательство всегда следить за тем, чтобы у вас был массив сообщений, даже если это массив из 1. Таким образом, вы не дублируете какую-либо обработку.

 $smsMessages = is_array( $result->GetIncomingMessagesResult->SMSIncomingMessage ) ? $result->GetIncomingMessagesResult->SMSIncomingMessage : array( $result->GetIncomingMessagesResult->SMSIncomingMessage ); foreach ( $smsMessages as $smsMessage ) { echo $smsMessage->Reference; } 

вам нужно указать ключ объекта массива SMSIncomingMessage.

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

или

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

Итерации по массиву ?! 🙂

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