【问题标题】:stdClass object and foreach loopsstdClass 对象和 foreach 循环
【发布时间】:2010-10-31 08:27:06
【问题描述】:

我正在使用以下代码使用 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;

那么我将如何处理多个结果?

任何帮助将不胜感激。

【问题讨论】:

    标签: php object foreach stdclass


    【解决方案1】:

    将对象转换为数组

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

    【讨论】:

      【解决方案2】:

      它是一个数组,因此您可以使用foreach 轻松循环它:

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

      然而值得注意的是,PHP 的 SoapClient 默认情况下,仅当数组中有多个值时才会将数组作为 PHP 数组返回 - 如果只有一个值,您将只获得该值(不包含在一个数组中)。解决此问题的一种简单方法是在SoapClient 构造函数中使用选项SOAP_SINGLE_ELEMENT_ARRAYS;这将防止这种行为并确保您始终获得数组。

      【讨论】:

      • 昨天花了一天时间对这件事感到困惑。我不知道“SOAP_SINGLE_ELEMENT_ARRAYS”标志;谢谢你。
      • 对于不知道如何添加选项的人:$client = new SoapClient('http://www.example.com', array('features' =&gt; SOAP_SINGLE_ELEMENT_ARRAYS,));
      【解决方案3】:

      您需要指定 SMSIncomingMessage 数组对象键。

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

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

      【讨论】:

        【解决方案4】:

        我的看法是始终确保你有一个消息数组,即使它是一个 1 的数组。这样你就不会重复任何处理。

        $smsMessages = is_array( $result->GetIncomingMessagesResult->SMSIncomingMessage )
            ? $result->GetIncomingMessagesResult->SMSIncomingMessage
            : array( $result->GetIncomingMessagesResult->SMSIncomingMessage );
        
        foreach ( $smsMessages as $smsMessage )
        {
            echo $smsMessage->Reference;
        }
        

        【讨论】:

          【解决方案5】:

          遍历数组?! :-)

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-05
            • 1970-01-01
            • 2012-01-03
            • 2013-06-23
            • 1970-01-01
            • 2021-01-19
            • 1970-01-01
            相关资源
            最近更新 更多