2009-06-04 9 views
14

Tôi đang sử dụng mã sau để lấy dữ liệu từ một trang web bằng Soap.đối tượng stdClass và vòng lặp foreach

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

Dưới đây là một mẫu của các đầu ra:

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 
         ) 

       ) 

     ) 

) 

Nếu chỉ có 1 kết quả được trả về, tôi chỉ có thể làm điều gì đó như thế này:

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

Vậy làm thế nào tôi sẽ đi về làm việc với nhiều kết quả?

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

37

Nó là một mảng, vì vậy bạn có thể vòng qua nó dễ dàng sử dụng foreach:

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

Tuy nhiên điều đáng chú ý rằng PHP SoapClient theo mặc định xuất hiện trở lại mảng như một mảng PHP chỉ khi có nhiều hơn một giá trị trong mảng - nếu chỉ có một giá trị bạn sẽ chỉ nhận được giá trị đó (không chứa trong một mảng). Một cách dễ dàng xung quanh việc này là sử dụng tùy chọn SOAP_SINGLE_ELEMENT_ARRAYS trong phương thức khởi tạo SoapClient; điều này sẽ ngăn chặn hành vi này và đảm bảo bạn luôn nhận được mảng.

+3

đã dành cả ngày hôm qua bối rối hơn điều này rất. Tôi không biết gì về lá cờ "SOAP_SINGLE_ELEMENT_ARRAYS"; cảm ơn vì điều đó. – nickmjones

+0

cho những người không biết cách thêm tùy chọn: '$ client = new SoapClient ('http://www.example.com', mảng ('features' => SOAP_SINGLE_ELEMENT_ARRAYS,));' –

0

Lặp lại mảng? :-)

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

Việc tôi thực hiện việc này là luôn đảm bảo bạn có một loạt thông báo, ngay cả khi đó là mảng 1. Theo cách đó bạn không sao chép bất kỳ quá trình xử lý nào.

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

foreach ($smsMessages as $smsMessage) 
{ 
    echo $smsMessage->Reference; 
} 
2

bạn cần chỉ định khóa đối tượng SMSIncomingMessage mảng.

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

hoặc

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