Объект stdClass и циклы foreach - PullRequest
14 голосов
/ 04 июня 2009

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

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

Вот пример вывода:

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;

Так как мне работать с несколькими результатами?

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

Ответы [ 4 ]

39 голосов
/ 04 июня 2009

Это массив, поэтому вы можете легко зациклить его, используя foreach:

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

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

3 голосов
/ 04 июня 2009

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

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

foreach ( $smsMessages as $smsMessage )
{
    echo $smsMessage->Reference;
}
2 голосов
/ 02 июля 2010

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

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

или

foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message)
{
$reference = $message[0]->Reference;
//...
}
0 голосов
/ 04 июня 2009

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

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