首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >php -用于XML的数组

php -用于XML的数组
EN

Stack Overflow用户
提问于 2017-12-15 02:25:11
回答 1查看 102关注 0票数 0

我在php中遇到了数组问题。我需要通过soap将带有一些产品项的xml发送到tag服务,但一个标记给我带来了疑惑。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不起作用!例如,我在订单中有4个项目,只有最后一个项目写在<itemEncomenda>标签中,其他项目不会出现。我想这是因为在数组中创建了一个索引itemEncomenda,它会覆盖旧的位置。我真的不知道如何通过重复此标记来挂载阵列。

下面是使用StdClass挂载xml并挂载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
                                                )

                                        )

                                )

                        )

                )

        )

)

需要帮助!

EN

回答 1

Stack Overflow用户

发布于 2017-12-19 20:20:20

以下是有问题的代码行:

$var->xml->remessa->encomendas->encomenda->itensEncomenda = new stdClass;
...
$var->xml->remessa->encomendas->encomenda->itensEncomenda->itemEncomenda = new stdClass;

发生的事情是,itensEncomenda是一个类,然后您创建一个属性itemEncomenda,它也是一个类。然后一次又一次地重写属性。从技术上讲,您需要的是让itensEncomeda成为一个类的数组。

或者,您需要在每次迭代中修改属性名称,因为属性名称必须是唯一的,这样才不会被重写(例如,itemEncomenda1、itemEncomenda2、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 ) ) )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47819868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档