web-dev-qa-db-ja.com

stdClassオブジェクトとforeachループ

Soapを使用してWebサイトからデータを取得するために次のコードを使用しています。

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

では、複数の結果を処理するにはどうすればよいでしょうか?

どんな助けでも大歓迎です。

16
jason_m

これは配列なので、foreachを使用して簡単にループできます。

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

ただし、PHPのSoapClientは、デフォルトでPHP配列が配列に複数の値がある場合にのみ配列を返すように見えます-値が1つしかない場合(配列内に含まれていない)その値を取得するだけです。これを回避する簡単な方法は、SoapClientコンストラクターでオプションSOAP_SINGLE_ELEMENT_ARRAYSを使用することです。これにより、この動作が防止され、常に配列を取得できます。

40
Tom Haigh

私の見解では、1の配列であっても、常にメッセージの配列があることを確認することです。これにより、処理を複製しません。

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

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

sMSIncomingMessage配列オブジェクトキーを指定する必要があります。

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

または

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

配列を反復しますか? :-)

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

オブジェクトをキャストして配列を変換する

$array = (array) json_decode(['TEST'=>true]);
0
Danilo Santos