【发布时间】:2014-07-21 18:25:21
【问题描述】:
我正在尝试在 PHP 中进行 SOAP 调用,它可以正常工作,但我有疑问:如何根据产品数量的数组将参数传递给 XML 创建新节点?看到这个...
这是我在 SoapUI 中的 XML(重要的部分:ITEMSITM > TITEMSITM。第一个 TITEMSITM 是字段,其他的都是一样的):
<soapenv:Header/>
<soapenv:Body>
<ns:MANUTENCAOSITM>
<ns:SITM>
<ns:CABECALHOSITM>
...
</ns:CABECALHOSITM>
<ns:ITEMSITM>
<!--Zero or more repetitions:-->
<ns:TITEMSITM>
<ns:CODIGOPRODUTO>0000265</ns:CODIGOPRODUTO>
<ns:DESCRICAOPRODUTO>REQ.CAT.0,410 POLI (PL10)</ns:DESCRICAOPRODUTO>
<ns:PERCENTUALDESCONTO>-1.03</ns:PERCENTUALDESCONTO>
<ns:PESOUNITARIO>0.41</ns:PESOUNITARIO>
<ns:PRECOBONIFICADO>10</ns:PRECOBONIFICADO>
<ns:PRECOTABELA>9.700</ns:PRECOTABELA>
<ns:PRECOUNITARIO>9.6</ns:PRECOUNITARIO>
<ns:QUANTIDADEBONIFICADA>20</ns:QUANTIDADEBONIFICADA>
<ns:QUANTIDADEVENDA>200</ns:QUANTIDADEVENDA>
<ns:SALDOBONIFICADO>0</ns:SALDOBONIFICADO>
<ns:TOTALBRUTO>1940.000</ns:TOTALBRUTO>
<ns:TOTALLIQUIDO>1920.000</ns:TOTALLIQUIDO>
<ns:TOTALPESO>82.000</ns:TOTALPESO>
<ns:VALORBONIFICADO>9.700</ns:VALORBONIFICADO>
<ns:VALORLIQUIDO>8.9550</ns:VALORLIQUIDO>
</ns:TITEMSITM>
<ns:TITEMSITM>
...
</ns:TITEMSITM>
<ns:TITEMSITM>
...
</ns:TITEMSITM>
</ns:ITEMSITM>
<ns:RODAPESITM>
<ns:CRESCIMENTOANTERIOR>?</ns:CRESCIMENTOANTERIOR>
<ns:TOTALINVESTIMENTO>0.1303</ns:TOTALINVESTIMENTO>
</ns:RODAPESITM>
</ns:SITM>
<ns:TIPOOPERACAO>3</ns:TIPOOPERACAO>
</ns:MANUTENCAOSITM>
</soapenv:Body>
我需要在 PHP 中为每个产品重复此节点 (TITEMSITM),但它不起作用,它只存储最后一项,就像我尝试做的下面的代码一样,但是没有成功。
$arguments = array(
'SITM' => array(
'CABECALHOSITM' => $pars1,
'ITEMSITM' => array(
'TITEMSITM' => $parsItem[0],
'TITEMSITM' => $parsItem[1],
'TITEMSITM' => $parsItem[2]
// ...
),
'RODAPESITM' => $pars2
),
'TIPOOPERACAO' => $pars3
);
$inserirItens = $cliente->MANUTENCAOSITM($arguments);
上面的代码调用没有问题,但是当我 print_r 或 var_dump $arguments 时,我看到 TITEMSITM 的重复只发送一个产品。我认为这很简单,但我没有得到。有人可以帮帮我吗?
参考资料:
【问题讨论】:
-
是的,很简单。在 PHP 数组中,一个键只能存在一次。这就是为什么稍后对键
TITEMSITM的赋值会覆盖前一个(重新阅读 php.net/array 以了解这些基本的 PHP 数组基础知识 - 它不会受到伤害)。所以最后一个赢了。删除最内层数组中的键,然后重试,应该可以工作,但我不完全确定 SOAPClient 和参数的数组表示法。 -
我把钥匙举例说明我的疑问和我想解决的方法。现在,我只需要知道如何做到这一点,不要覆盖最后的“TITEMSITM”,而是创建新闻“TITEMSITM”并添加产品信息 =/
-
尝试使用类似
'ITEMSITM' => array('TITEMSITM' => array($parsItem[0], $parsItem[1], ... ) ...的方式,这样您就可以通过这些项目的数组获得一次密钥。 IIRC 应该可以工作,但正如我所写的那样,我不是 100% 确定的。自从我上次这样做以来已经有一段时间了。 -
通过这种方式,它捕获了所有产品的信息,好吧,但不要创建其他'TITEMSITM',它只理解一个项目。 XML 需要用“TITEMSITM”分隔每一个。你知道?感谢 cmets..
-
是的,我知道,从一开始就很清楚。但如果这不起作用(我看到它是双倍的,你可能会剪掉里面的那个),我没有提示。试一试,你也可以搜索类似的问答。您甚至可以在 cmets 或您的问题中链接此处(顺便说一句,这是一种很好的做法。链接然后解释什么对您有用或没用,这里是一个示例:stackoverflow.com/q/24570784/367456)