Объект 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;

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

или

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

Ответ 4

Итерации по массиву?!: -)

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