Reputation: 179
I am using the following code to get data from a website using 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>";
Here is a sample of the output:
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
)
)
)
)
If only 1 result is returned, I can simply do something like this:
$reference = $result->GetIncomingMessagesResult->SMSIncomingMessage->Reference;
So how would I go about working with multiple results?
Any help would be greatly appreciated.
Upvotes: 17
Views: 93053
Reputation: 452
Cast object to convert array
$array = (array) json_decode(['TEST'=>true]);
Upvotes: 1
Reputation: 57845
It is an array, so you can loop over it easily using foreach
:
foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message) {
echo $message->Reference;
}
However it is worth noting that PHP's SoapClient
by default appears to return arrays as a PHP array only when there is more than one value in the array - if there is only one value you will just get that value (not contained within an array). An easy way around this is to use the option SOAP_SINGLE_ELEMENT_ARRAYS
in the SoapClient
constructor; this will prevent this behaviour and ensure you always get arrays.
Upvotes: 41
Reputation: 498
you need to specify your SMSIncomingMessage arrays object key.
$result->GetIncomingMessagesResult->SMSIncomingMessage[0]->Reference;
or
foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message)
{
$reference = $message[0]->Reference;
//...
}
Upvotes: 2
Reputation: 105914
My take on it is to just always make sure you have an array of messages, even if it's an array of 1. That way you don't duplicate any processing.
$smsMessages = is_array( $result->GetIncomingMessagesResult->SMSIncomingMessage )
? $result->GetIncomingMessagesResult->SMSIncomingMessage
: array( $result->GetIncomingMessagesResult->SMSIncomingMessage );
foreach ( $smsMessages as $smsMessage )
{
echo $smsMessage->Reference;
}
Upvotes: 3
Reputation: 17896
Iterate over the array?! :-)
foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message)
{
$reference = $message->Reference;
//...
}
Upvotes: 0