我正在研究以下内容,我希望这是一个简单的脚本。我使用Cisco AXL WSDL联系我的Cisco CUPS服务器运行SQL查询,遍历结果,然后将其反馈到另一个步骤,将返回的行更新为某个值。但是,当我回来的SOAP响应不同于单行(数组对象)与多行(数组中的数组)时,我遇到了挑战。
现在这里的脚本我只是试图循环并回避我在变得更复杂之前得到的东西。
<?php
$client = new SoapClient("/var/www/AXLAPI.wsdl",
array('trace'=>true,
'exceptions'=>true,
'location'=>"https://cups-test:8443/axl",
'login'=>'admin',
'password'=>'password',
));
$response = $client->executeSQLQuery(array("sql"=>"select pkid from epasenduser where enablemoc = 't'"));
// var_dump($response);
foreach ($response as $row){
// var_dump($row->row);
echo("PKID: ".$row->pkid)."<br>";
}
?>
让我们先看看实际的SOAP响应是什么: 对于单行,它看起来像这样:
object(stdClass)#2 (1) {
["return"]=>
object(stdClass)#3 (1) {
["row"]=>`
object(stdClass)#4 (1) {
["pkid"]=>
string(36) "9dbd9b32-8d64-41ad-a355-8f62e050ffce"
}
}
}
对于多行:
object(stdClass)#2 (1) {
["return"]=>
object(stdClass)#3 (1) {
["row"]=>
array(2) {
[0]=>
object(stdClass)#4 (1) {
["pkid"]=>
string(36) "fa0540f7-8e75-481b-a193-7a06d7f601a8"
}
[1]=>
object(stdClass)#5 (1) {
["pkid"]=>
string(36) "fa0c8c7a-79be-4667-ae70-c3e773908b52"
}
}
}
}
这里的挑战是因为对象在SOAP响应中多次返回我猜测PHP每次看到它时都会指定一个递增的整数值。所以,如果我想达到我可以引用PKID的地步,我最终会得到两个不同的陈述:
对于单个项目,它是:
foreach ($response->return as $row){
var_dump($row->pkid);
}
对于多个项目,它是:
foreach ($response->return->row as $row){
var_dump($row->pkid);
}
所以问题是,有没有办法让我在foreach循环中只返回PKID值而不提前评估数组?希望这是有道理的,自我承认的网络工程师首先和婴儿&#34;开发人员&#34;第二
答案 0 :(得分:2)
所有这些都归结为让智能手机不那么聪明,并确保我总能得到一个阵列。
精彩的写在这里: http://blog.jasonrichardsmith.org/programming/soap-and-single-element-arrays/
它的长短是改变我的连接设置:
$client = new SoapClient("/var/www/AXLAPI.wsdl",
array('trace'=>true,
'exceptions'=>true,
'features'=>SOAP_SINGLE_ELEMENT_ARRAYS,
'location'=>"https://cups-test:8443/axl",
'login'=>'admin',
'password'=>'password',
));
包含'features'=>SOAP_SINGLE_ELEMENT_ARRAYS,
命令可确保即使在单个结果上,它也可以构建为数组而不是对象。