web-dev-qa-db-fra.com

Objet stdClass et boucles foreach

J'utilise le code suivant pour obtenir des données d'un site Web utilisant 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>";

Voici un échantillon de la sortie:

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
                        )

                )

        )

)

Si seulement 1 résultat est retourné, je peux simplement faire quelque chose comme ceci:

$reference = $result->GetIncomingMessagesResult->SMSIncomingMessage->Reference;

Alors, comment pourrais-je travailler avec plusieurs résultats?

Toute aide serait grandement appréciée.

16
jason_m

C'est un tableau, vous pouvez donc le parcourir facilement en utilisant foreach:

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

Cependant, il convient de noter que SoapClient de PHP par défaut semble renvoyer les tableaux sous la forme d'un tableau PHP uniquement lorsqu'il y a plus d'une valeur dans le tableau - s'il n'y a qu'une seule valeur vous obtiendrez juste cette valeur (non contenue dans un tableau). Un moyen simple de contourner cela est d'utiliser l'option SOAP_SINGLE_ELEMENT_ARRAYS dans le constructeur SoapClient; cela empêchera ce comportement et garantira que vous obtenez toujours des tableaux.

40
Tom Haigh

Mon point de vue est de toujours vous assurer d'avoir un tableau de messages, même s'il s'agit d'un tableau de 1. De cette façon, vous ne dupliquez aucun traitement.

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

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

vous devez spécifier la clé d'objet de vos tableaux SMSIncomingMessage.

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

ou

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

Itérer sur le tableau?! :-)

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

Cast objet pour convertir le tableau

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