2013-03-19 109 views
2

好了SOAP響應,所以我使用SOAP和使用「的foreach」循環輸出狀態請求從服務國家和城市,並在各在這些迭代中,我使用另一個'foreach'循環輸出每個州內的城市。PHP:使用嵌套「的foreach」循環輸出XML數據來自沒有工作

首先,SOAP調用:

$client = new SoapClient("https://devxml.#####.com/golfService.asmx?wsdl", array(‘features’ => SOAP_SINGLE_ELEMENT_ARRAYS)); 

$regionList = $client->Areas(
    array(
     'Hdr' => array(
      'ResellerId' => '#####', 
      'SourceCd' => 'A', 
      'UserIp' => '207.58.123.121', 
      'gsDebug' => '1' 
     ), 
     'Req' => array(
      'CountryID' => 'USA', 
      'RegionID' => '' 
     ) 
    ) 
) 

...返回下面的XML:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
<AreasResponse xmlns="http://xml.####.com/"> 
<AreasResult> 
<RetCd>0</RetCd> 
<RetMsg /> 
<Countries> 
    <Country> 
     <id>USA</id> 
     <nm>United States</nm> 
     <Regions> 
      <Region> 
       <id>AZ</id> 
       <nm>Arizona</nm> 
       <Areas> 
        <Area> 
         <id>Phoenix Northeast</id> 
         <nm>Phoenix Northeast</nm> 
        </Area> 
       </Areas> 
      </Region> 
      <Region> 
       <id>FL</id> 
       <nm>Florida</nm> 
       <Areas> 
        <Area> 
         <id>Ft. Myers/Naples</id> 
         <nm>Ft. Myers/Naples</nm> 
        </Area> 
        <Area> 
         <id>Miami/Ft. Lauderdale</id> 
         <nm>Miami/Ft. Lauderdale</nm> 
        </Area> 
       </Areas> 
      </Region> 
     </Regions> 
    </Country> 
</Countries> 
</AreasResult> 
</AreasResponse> 
</soap:Body> 
</soap:Envelope> 

現在,這裏就是我如何在我的PHP處理這樣的:

foreach ($regionList->AreasResult->Countries->Country->Regions->Region as $region): 
    echo $region->nm . ": "; 
    foreach ($region->Areas->Area as $area): 
     echo $area->nm . ", "; 
    endforeach; 
    echo "<br />"; 
endforeach; 

理想情況下,這會輸出爲:

亞利桑那州鳳凰城東北,
佛羅里達州:FT。邁爾斯/那不勒斯,邁阿密/英尺。勞德代爾堡,

但是,沒有!它顯示如下:

亞利桑那:,,
佛羅里達州:英尺。邁爾斯/那不勒斯,邁阿密/英尺。勞德代爾堡,

兩個後逗號「亞利桑那:」意味着有兩個記錄,但只有一個。更令人氣憤的是它不會輸出dang Area的值。 我在做什麼錯?幫助我,StackOverflow,你是我唯一的希望!

+0

我們展示的代碼。 – 2013-03-19 18:10:18

+1

對不起!我在寫完之前意外地發佈了這個問題。 – Josh 2013-03-19 18:37:03

+0

不應該是'foreach($ region-> Areas-> Area)'嗎? – 2013-03-19 21:52:26

回答

1

這可能與陣列沒有,即使你使用的單個數組元素的功能被正確地投。我用這個功能在過去,可能在這種情況下工作:

function forceList($obj, $prop) 
{ 
    $r = &$obj->$prop; 
    return isset($r) ? is_array($r) ? $r : array($r) : array(); 
} 

foreach (forceList($region->Areas, 'Area') as $area) { ... } 

我知道,它利用了兩個三元運營商,但我沒有測試它;-)

+0

傑克您好,感謝您的回答。我真的不明白你的代碼在做什麼(爲什麼通過引用傳遞'$ obj - > $ prop'),但我已經用我自己的方式「解決」了它,寫了一個非常不合適的kludge,它複製了一堆代碼並使用if語句來查看它是一個對象還是一個數組。 – Josh 2013-04-05 14:57:04

+0

@user它將一個對象轉換爲一個數組,並保留現有的數組。該參考用於真正縮短代碼。 – 2013-04-05 15:09:57