2017-12-14 15 views
0

PHPの配列に問題があります。いくつかの商品アイテムを使ってwebサービスにSOAPを介してxmlを送信する必要がありますが、タグで疑問が生じます。 <itemEncomenda>タグは順序がありどのように多くの製品に応じて繰り返され、そしてそれは私がPHPに供給することはできませんまさにだとphp - 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>[email protected]</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>[email protected]</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> 

お知らせ:WSDLのマニュアルは、このようなXMLを持っています。

例で要求された位置に配列をマウントするのにStdClassを使用していて、xmlをSoapVarでマウントしていますが、すべてのタグで機能しますが、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] => [email protected] 
            [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] => [email protected] 
            [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 
               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

助けが必要!何が起こることはitensEncomendaが、あなたはまた、クラスであるプロパティitemEncomendaを作成し、クラスであるということである

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

+0

誰かしてください! –

答えて

1

これらは問題行です。次に、プロパティを何度も書き換えます。技術的に欲しいのは、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)))