PHP:使用嵌套'从SOAP响应输出XML数据的循环不起作用


PHP: Using nested 'foreach' loops to output XML data from SOAP response not working

好的,所以我使用SOAP从服务请求州和城市,并使用'foreach'循环输出状态,并且在每个迭代中,我使用另一个'foreach'循环输出每个状态中的城市。

首先,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;

理想情况下,这将输出为:

亚利桑那州:凤凰城东北部,
佛罗里达州:迈尔斯堡/那不勒斯,迈阿密/劳德代尔堡,

但不!它是这样显示的:

Arizona:,,
佛罗里达州:迈尔斯堡/那不勒斯,迈阿密/劳德代尔堡,

'Arizona:'后面的两个逗号表示有两个记录,但只有一个。更令人恼火的是,它不会输出该死的Area值。我做错了什么?帮帮我,StackOverflow,你是我唯一的希望!

这可能与即使使用单个数组元素特性也不能正确转换数组有关。我以前使用过这个函数,在这种情况下可能会起作用:

function forceList($obj, $prop)
{
    $r = &$obj->$prop;
    return isset($r) ? is_array($r) ? $r : array($r) : array();
}
foreach (forceList($region->Areas, 'Area') as $area) { ... }

我知道,它使用了两个三元操作符,但我确实测试了它;-)