2013-03-19 84 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