Array for XML



我在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 ) ) )

最新更新