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