【问题标题】:Single array element becomes object with Zend_Soap_Client单个数组元素成为 Zend_Soap_Client 的对象
【发布时间】:2013-09-27 12:20:34
【问题描述】:

我正在使用 Zend_Soap_Client 并遇到了这个问题:

<parent>
    <child><name>abc</name></child>
    <child><name>def</name></child>
</parent>

如果有多个子元素,则 Zend 返回数组,我可以像访问一样访问

$result-&gt;parent-&gt;child[0]-&gt;name

但如果只有一个子节点,它会返回如下对象:

$result-&gt;parent-&gt;child-&gt;name

您能否告诉我我的方法有什么问题或者我该如何克服它?

我的示例代码:

$client = new Zend_Soap_Client('url', array('wsdl'=>'url));
$result = $client->getResult();

我使用的是 zend 1.9。 PHP 的原生 SoapClient 也会出现同样的问题

谢谢!

【问题讨论】:

  • if(is_object($result->parent->child))....也许你可以做一些事情并将结果转换为数组
  • is_array() 应该被使用,因为 is_object() 在这两种情况下都是真的。数组也是一个对象。现在我正在使用它,但由于有几个这样的元素,我不认为这是最好的方法。谢谢!
  • 您有两种情况:1) $result->parent->child 是一个数组,2) 是一个对象...如果不是数组,则使用 aux var 并强制转换 $result ->parent->child 到一个数组...我认为这是一个很好的方法
  • 我试过了,但没有成功。我使用 (array) 进行投射和 $result->parent->child = array($result->parent-data->child) 但没有成功。它在 foreach 循环中抛出无效参数。如果我做错了,你能纠正一下代码吗?
  • 向我展示你的 foreach 循环的结构,以便为你提供正确的代码;)

标签: php zend-framework soap


【解决方案1】:

我个人认为不需要使用Zend_Soap_Client 代替SoapClient,因为 Zend 版本没有添加任何有益的东西,但另一方面,该解决方案适用于两者:

在原始的SoapClient 中有一个 options 数组参数,它可以接受很多东西,尤其是下面的这个 (ref):

features 选项是 SOAP_SINGLE_ELEMENT_ARRAYS 的位掩码,...

使用此选项,soap 响应中的所有数组结构如果仅包含一个元素,则不会减少为单个元素,而是保持原样。你总是在访问一个数组,这比根据内容切换更容易。

例子:

$s = new SoapClient($wsdl, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));

【讨论】:

  • 谢谢!即使使用 SoapClient 我也得到了相同的结果,但 SOAP_SINGLE_ELEMENT_ARRAYS 似乎是一个希望......让我试一试......
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多