我在php中的数组有问题。我需要通过一些产品项目将XML通过肥皂发送到Web服务,但标签使我怀疑。WSDL手册具有这样的XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.edei.correios.com.br/"> <soapenv:Header/>
<soapenv:Body>
<ser:solicitarCodigoEtiquetaInternacional>
<!--Optional:-->
<xml>
<remessa>
<idioma>PT</idioma>
<encomendas>
<encomenda>
<cartaoDePostagem>0061962740</cartaoDePostagem>
<codigoControleCliente>100052202</codigoControleCliente>
<nomeRemetente>magento.COM</nomeRemetente>
<enderecoRemetente>Street Test</enderecoRemetente>
<numeroEnderecoRemetente>2017</numeroEnderecoRemetente>
<complementoEnderecoRemetente></complementoEnderecoRemetente>
<codigoPostalRemetente>83642</codigoPostalRemetente>
<cidadeRemetente>MERIDIAN</cidadeRemetente>
<estadoRemetente>ID</estadoRemetente>
<paisRemetente>US</paisRemetente>
<emailRemetente>sales@bodybuilding.com</emailRemetente>
<telefoneRemetente></telefoneRemetente>
<siteRemetente>www.bodybuilding.com</siteRemetente>
<nomeDestinatario>Junior Maia</nomeDestinatario>
<tipoDocumentoDestinatario>1</tipoDocumentoDestinatario>
<numeroDocumentoDestinatario>16549651468</numeroDocumentoDestinatario>
<enderecoDestinatario>Street Test</enderecoDestinatario>
<numeroEnderecoDestinatario>S/N</numeroEnderecoDestinatario>
<complementoEnderecoDestinatario>Test</complementoEnderecoDestinatario>
<codigoPostalDestinatario>70680506</codigoPostalDestinatario>
<caixaPostalDestinatario></caixaPostalDestinatario>
<cidadeDestinatario>Curitiba</cidadeDestinatario>
<ufDestinatario>PR</ufDestinatario>
<paisDestinatario>BR</paisDestinatario>
<emailDestinatario>comoquepode@gmail.com</emailDestinatario>
<telefoneDestinatario></telefoneDestinatario>
<pesoObjeto>150</pesoObjeto>
<comprimentoObjeto>16</comprimentoObjeto>
<larguraObjeto>11</larguraObjeto>
<alturaObjeto>2</alturaObjeto>
<modalidadeDistribuicaoObjeto>33375</modalidadeDistribuicaoObjeto>
<modalidadePagamentoImpostosObjeto>1</modalidadePagamentoImpostosObjeto>
<codigoMoeda>USD</codigoMoeda>
<valorFreteObjeto>50.00</valorFreteObjeto>
<valorSeguroObjeto>0.00</valorSeguroObjeto>
<modoDevolucaoObjeto>1</modoDevolucaoObjeto>
<seguroDevolucaoObjeto>N</seguroDevolucaoObjeto>
<itensEncomenda>
<itemEncomenda>
<codigoSHItem>100190</codigoSHItem>
<codigoSKUItem>TYH820040</codigoSKUItem>
<descricaoItem>BPI SPORTS BLOX - 110 SERVINGS - BLUEBERRY</descricaoItem>
<quantidadeItem>1</quantidadeItem>
<valorUnitario>100.00</valorUnitario>
<pesoUnitario></pesoUnitario>
</itemEncomenda>
<itemEncomenda>
<codigoSHItem>100191</codigoSHItem>
<codigoSKUItem>TYH820041</codigoSKUItem>
<descricaoItem>BPI SPORTS BLOX - 110 SERVINGS - WHITE</descricaoItem>
<quantidadeItem>1</quantidadeItem>
<valorUnitario>100.00</valorUnitario>
<pesoUnitario></pesoUnitario>
</itemEncomenda>
<itemEncomenda>
<codigoSHItem>100192</codigoSHItem>
<codigoSKUItem>TYH820042</codigoSKUItem>
<descricaoItem>BPI SPORTS BLOX - 110 SERVINGS - RED</descricaoItem>
<quantidadeItem>1</quantidadeItem>
<valorUnitario>100.00</valorUnitario>
<pesoUnitario></pesoUnitario>
</itemEncomenda>
</itensEncomenda>
</encomenda>
</encomendas>
</remessa>]]>
</xml>
</ser:solicitarCodigoEtiquetaInternacional>
</soapenv:Body>
请注意,<itemEncomenda>
标签会根据订单的产品重复重复,这正是我无法送入PHP的产品。
我正在使用stdclass在示例中使用请求的位置安装一个数组,并使用SOAPVAR安装XML,它适用于所有标签,但对于itemEncomenda
no!例如,我有4个按顺序进行的项目,只有最后一个是在<itemEncomenda>
标签中写的,而其他项目则没有出现。我想这是因为在阵列中创建索引itemEncomenda
,并且会覆盖旧位置。我真的不知道如何通过重复此标签来安装数组。
在这里我的代码将XML与StdClass
安装并安装xml
:
$var = new StdClass;
$var->xml = new stdClass;
$var->xml->remessa = new stdClass;
$var->xml->remessa->idioma = $this->idioma;
$var->xml->remessa->encomendas = new stdClass;
$var->xml->remessa->encomendas->encomenda = new stdClass;
//remetende
$var->xml->remessa->encomendas->encomenda->cartaoDePostagem = $this->cartao_postagem;
$var->xml->remessa->encomendas->encomenda->codigoControleCliente = '';
$var->xml->remessa->encomendas->encomenda->nomeRemetente = $this->remetente_nome;
$var->xml->remessa->encomendas->encomenda->enderecoRemetente = $this->remetente_rua;
$var->xml->remessa->encomendas->encomenda->numeroEnderecoRemetente = $this->remetente_numero;
$var->xml->remessa->encomendas->encomenda->complementoEnderecoRemetente = $this->remetente_complemento;
$var->xml->remessa->encomendas->encomenda->codigoPostalRemetente = $this->remetente_cep;
$var->xml->remessa->encomendas->encomenda->cidadeRemetente = $this->remetente_cidade;
$var->xml->remessa->encomendas->encomenda->estadoRemetente = $this->remetente_estado;
$var->xml->remessa->encomendas->encomenda->paisRemetente = $this->remetente_pais;
$var->xml->remessa->encomendas->encomenda->emailRemetente = $this->remetente_email;
$var->xml->remessa->encomendas->encomenda->telefoneRemetente = $this->remetente_telefone;
$var->xml->remessa->encomendas->encomenda->siteRemetente = $this->remetente_site;
//destinatário customer
$var->xml->remessa->encomendas->encomenda->nomeDestinatario = $customer_nome;
$var->xml->remessa->encomendas->encomenda->tipoDocumentoDestinatario = '1'; //1-cpf 2-cnpj 3-passport 4-not informed
$var->xml->remessa->encomendas->encomenda->numeroDocumentoDestinatario = $customer_taxvat;
$var->xml->remessa->encomendas->encomenda->enderecoDestinatario = $customer_rua;
$var->xml->remessa->encomendas->encomenda->numeroEnderecoDestinatario = $customer_rua_numero;
$var->xml->remessa->encomendas->encomenda->complementoEnderecoDestinatario = $customer_compemento;
$var->xml->remessa->encomendas->encomenda->codigoPostalDestinatario = $customer_cep;
$var->xml->remessa->encomendas->encomenda->caixaPostalDestinatario = '';
$var->xml->remessa->encomendas->encomenda->cidadeDestinatario = $customer_cidade;
$var->xml->remessa->encomendas->encomenda->ufDestinatario = $customer_uf;
$var->xml->remessa->encomendas->encomenda->paisDestinatario = $customer_pais;
$var->xml->remessa->encomendas->encomenda->emailDestinatario = $customer_email;
$var->xml->remessa->encomendas->encomenda->telefoneDestinatario = $customer_telefone;
//objeto
$var->xml->remessa->encomendas->encomenda->pesoObjeto = '';
$var->xml->remessa->encomendas->encomenda->comprimentoObjeto = '';
$var->xml->remessa->encomendas->encomenda->larguraObjeto = '';
$var->xml->remessa->encomendas->encomenda->alturaObjeto = '';
$var->xml->remessa->encomendas->encomenda->modalidadeDistribuicaoObjeto = $this->modalidade_distribuicao_objeto;
$var->xml->remessa->encomendas->encomenda->modalidadePagamentoImpostosObjeto = $this->modalidade_pagamento_imposto;
$var->xml->remessa->encomendas->encomenda->codigoMoeda = $this->moeda;
$var->xml->remessa->encomendas->encomenda->valorFreteObjeto = '';
$var->xml->remessa->encomendas->encomenda->valorSeguroObjeto = '';
$var->xml->remessa->encomendas->encomenda->modoDevolucaoObjeto = $this->modo_devolocao;
$var->xml->remessa->encomendas->encomenda->seguroDevolucaoObjeto = $this->seguro_devolucao ;
//itens
$var->xml->remessa->encomendas->encomenda->itensEncomenda = new stdClass;
foreach ($invoice->getAllItems() as $item){
if ($item->getOrderItem()->getParentItem()) {
continue;
}
$item_name = $item->getName();
$item_sku = $item->getSku();
$item_id = $item->getProductId();
$item_qty = $item->getQty();
$item_price = $item->getPrice();
$_product = Mage::getModel('catalog/product')->load($item_id);
$item_peso = $_product->getWeight();
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda = new stdClass;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->codigoSHItem = '';
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->codigoSKUItem = $item_sku;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->descricaoItem = $item_name;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->quantidadeItem = $item_qty;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->valorUnitario = $item_price;
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda->pesoUnitario = $item_peso;
}
print_r($var);
控制台上的输出完全是一个数组,但只有1个项目,在$invoice->getAllItems()
中有5个!
输出:
2017-12-14T18:17:04+00:00 DEBUG (7): stdClass Object
(
[xml] => stdClass Object
(
[remessa] => stdClass Object
(
[idioma] => PT
[encomendas] => stdClass Object
(
[encomenda] => stdClass Object
(
[cartaoDePostagem] => 0057018901
[codigoControleCliente] =>
[nomeRemetente] =>
[enderecoRemetente] =>
[numeroEnderecoRemetente] =>
[complementoEnderecoRemetente] =>
[codigoPostalRemetente] =>
[cidadeRemetente] =>
[estadoRemetente] =>
[paisRemetente] =>
[emailRemetente] =>
[telefoneRemetente] =>
[siteRemetente] =>
[nomeDestinatario] => josué ribeiro de frança rocha
[tipoDocumentoDestinatario] => 1
[numeroDocumentoDestinatario] => 69077886168
[enderecoDestinatario] => QNE 34 casa 16 Taguatinga Norte
[numeroEnderecoDestinatario] => 16
[complementoEnderecoDestinatario] => Sandu Norte
[codigoPostalDestinatario] => 72125340
[caixaPostalDestinatario] =>
[cidadeDestinatario] => Brasília
[ufDestinatario] => DF
[paisDestinatario] => BR
[emailDestinatario] => josurbeiro@gmail.com
[telefoneDestinatario] => (61) 98379-7370
[pesoObjeto] =>
[comprimentoObjeto] =>
[larguraObjeto] =>
[alturaObjeto] =>
[modalidadeDistribuicaoObjeto] => 33367
[modalidadePagamentoImpostosObjeto] => 1
[codigoMoeda] => BRL
[valorFreteObjeto] =>
[valorSeguroObjeto] =>
[modoDevolucaoObjeto] => 1
[seguroDevolucaoObjeto] => 1
[itensEncomenda] => stdClass Object
(
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-preto
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Preto
[quantidadeItem] => 2.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
)
)
)
)
)
)
应该是5 [itemEncomenda]
:
2017-12-14T18:17:04+00:00 DEBUG (7): stdClass Object
(
[xml] => stdClass Object
(
[remessa] => stdClass Object
(
[idioma] => PT
[encomendas] => stdClass Object
(
[encomenda] => stdClass Object
(
[cartaoDePostagem] => 0057018901
[codigoControleCliente] =>
[nomeRemetente] =>
[enderecoRemetente] =>
[numeroEnderecoRemetente] =>
[complementoEnderecoRemetente] =>
[codigoPostalRemetente] =>
[cidadeRemetente] =>
[estadoRemetente] =>
[paisRemetente] =>
[emailRemetente] =>
[telefoneRemetente] =>
[siteRemetente] =>
[nomeDestinatario] => josué ribeiro de frança rocha
[tipoDocumentoDestinatario] => 1
[numeroDocumentoDestinatario] => 69077886168
[enderecoDestinatario] => QNE 34 casa 16 Taguatinga Norte
[numeroEnderecoDestinatario] => 16
[complementoEnderecoDestinatario] => Sandu Norte
[codigoPostalDestinatario] => 72125340
[caixaPostalDestinatario] =>
[cidadeDestinatario] => Brasília
[ufDestinatario] => DF
[paisDestinatario] => BR
[emailDestinatario] => josurbeiro@gmail.com
[telefoneDestinatario] => (61) 98379-7370
[pesoObjeto] =>
[comprimentoObjeto] =>
[larguraObjeto] =>
[alturaObjeto] =>
[modalidadeDistribuicaoObjeto] => 33367
[modalidadePagamentoImpostosObjeto] => 1
[codigoMoeda] => BRL
[valorFreteObjeto] =>
[valorSeguroObjeto] =>
[modoDevolucaoObjeto] => 1
[seguroDevolucaoObjeto] => 1
[itensEncomenda] => stdClass Object
(
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-preto
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Preto
[quantidadeItem] => 2.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-branco
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Branco
[quantidadeItem] => 2.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-vermelho
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Vermelho
[quantidadeItem] => 3.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-verde
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Verde
[quantidadeItem] => 1.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
[itemEncomenda] => stdClass Object
(
[codigoSHItem] =>
[codigoSKUItem] => LI-60669896245-cinca
[descricaoItem] => Smartwatch DZ09 Câmera 2.0 MP Bluetooth Conectividade Redes Sociais Fashion - Cinza
[quantidadeItem] => 4.0000
[valorUnitario] => 49.9000
[pesoUnitario] => 0.4000
)
)
)
)
)
)
)
需要帮助!
这些是有问题的行:
$var->xml->remessa->encomendas->encomenda->itensEncomenda = new stdClass;
...
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda = new stdClass;
发生的是itensEncomenda
是一类,然后创建一个也是类的属性itemEncomenda
。然后,您一次又一次地重写该属性。从技术上讲,您想要的是itensEncomeda
是一系列类。
否则您需要在每次迭代中修改属性名称,因为属性需要命名为不被重写的唯一命名(例如itemencomenda1,itemencOncomenda2,itemencomenda3)
为了简化,这就是您正在做的:
$holder = new stdClass();
$holder->items = new stdClass();
$allItems = array('hi', 'nope', 'lala');
foreach($allItems as $value) {
$holder->items->item = new stdClass();
$holder->items->item->value = $value;
}
print_r($holder);
输出:
stdClass Object (
[items] => stdClass Object (
[item] => stdClass Object (
[value] => lala ) ) )
需要成为:
$holder = new stdClass();
$holder->items = array();
$allItems = array('hi', 'nope', 'lala');
foreach($allItems as $value) {
$item = new stdClass();
$item->value = $value;
$holder->items[] = $item;
}
print_r($holder);
输出:
stdClass Object (
[items] => Array (
[0] => stdClass Object ( [value] => hi )
[1] => stdClass Object ( [value] => nope )
[2] => stdClass Object ( [value] => lala ) ) )