2009-06-04 11 views
14

मैं साबुन का उपयोग कर वेबसाइट से डेटा प्राप्त करने के लिए निम्न कोड का उपयोग कर रहा हूं।stdClass ऑब्जेक्ट और foreach loops

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

तो मैं के बारे में कैसे जाना होगा कई परिणामों के साथ काम कर रहे हैं?

किसी भी मदद की सराहना की जाएगी।

उत्तर

37

यह एक सरणी है, तो आप इस पर पाश आसानी से foreach का उपयोग कर सकते हैं:

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

हालांकि यह ध्यान देने योग्य PHP के SoapClient डिफ़ॉल्ट रूप से एक PHP सरणी के रूप में सरणियों वापस जाने के लिए केवल जब वहाँ से भी अधिक है प्रतीत होता है कि लायक है सरणी में एक मान - यदि केवल एक मान है तो आपको वह मान मिलेगा (सरणी में निहित नहीं है)। SoapClient कन्स्ट्रक्टर में SOAP_SINGLE_ELEMENT_ARRAYS विकल्प का उपयोग करने के लिए इसका एक आसान तरीका है; यह इस व्यवहार को रोक देगा और सुनिश्चित करेगा कि आप हमेशा सरणी प्राप्त करें।

+3

कल दिन बिताया यह बहुत ही बात से अधिक हैरान। मुझे "SOAP_SINGLE_ELEMENT_ARRAYS" ध्वज के बारे में कोई जानकारी नहीं थी; उसके लिए धन्यवाद। – nickmjones

+0

उन लोगों के लिए जो विकल्प नहीं जोड़ते हैं: '$ client = new SoapClient ('http://www.example.com', सरणी ('विशेषताएं' => SOAP_SINGLE_ELEMENT_ARRAYS,));' –

0

सरणी पर Iterate ?! :-)

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

उस पर मेरी ले बस हमेशा सुनिश्चित करें कि आप संदेशों की एक सरणी है, भले ही वह इस तरह आप किसी भी प्रसंस्करण नकल नहीं है 1. की एक सरणी है बनाने के लिए है।

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

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

आपको अपना एसएमएस इनकमिंग मैसेज एरे ऑब्जेक्ट कुंजी निर्दिष्ट करने की आवश्यकता है।

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

या

foreach ($result->GetIncomingMessagesResult->SMSIncomingMessage as $message) 
{ 
$reference = $message[0]->Reference; 
//... 
} 
संबंधित मुद्दे