将数组的内容插入到不起作用的对象中

时间:2017-12-01 20:20:18

标签: php arrays object

我正在创建一个带有产品系列参数的发票对象。因为订单可以有很多产品,所以我使用的是一个收集一系列订单项的迭代器。 $ prod_line是一个包含产品系列数组的数组。

我希望能够将$ prod_line的内容注入到我的对象中,但是在使用$ prod_line [0]或$ prod_line [1]时我才会成功。

我已经尝试了一些技术来删除父层数组,例如array_merge_recursive - 但是我一直坚持这个愚蠢的问题几个小时没有运气,真的需要进步。

非常感谢帮助!!

注意:为了便于阅读,下面的代码被删除 - 忽略丢失的变量实例化并用于概念。

Quickbooks_Invoice.php

 function create_qb_invoice()
     {

           foreach ($az as $order_id => $order) // FOR EACH ORDER
           {
             $line_id = 1;

             foreach ($order['products'] as $product) // FOR EACH PRODUCTS
             {

               // A 'LINE' STANDS FOR AN ITEMIZED PRODUCT LINE IN QUICKBOOKS INVOICE FORMS

                  // FOR EACH PRODUCT, CREATE A LINE FOR QUICKBOOKS INVOICE
                  $prod_line[] =
                  [
                     "Id" => $line_id,
                     "LineNum" => $line_id,
                     "Amount" => $product['ItemPrice']['Amount'],
                     "DetailType" => "SalesItemLineDetail",
                     "SalesItemLineDetail" => [
                         "ItemRef" => [
                         "value" => $theItemId,
                         "name" => $theItemName
                         ],
                         "TaxCodeRef" => [
                         "value" => "NON"
                         ],
                         "UnitPrice" =>  $product['ItemPrice']['Amount'],
                         "Qty" => $product['QuantityOrdered'],
                       ]
                     ];

                    $line_id ++;

                }

                $myInvoiceObj = Invoice::create([
                  "LinkedTxn" => [],
                  "Line" =>
                  [
                      // THIS SHOULD BE REPLACED WITH THE $prod_line VARIABLE
                      // HOWEVER I'VE ONLY BEEN ABLE TO USE $prod_line[0], OR $prod_line[1]
                      // REGULAR $prod_line HAS AN EXTRA LAYER OF ARRAY THAT Invoice::create WON'T BE EXPECTING
                      // STRIPPING AWAY THE CONTAINING ARRAY IS NOT WORKING WHEN i USE array_merge_recursive or similar solutions

                      // [
                      //     "Id" => "1",
                      //     "LineNum" => 1,
                      //     "Amount" => $order['ItemPrice']['Amount'],
                      //     "DetailType" => "SalesItemLineDetail",
                      //     "SalesItemLineDetail" =>
                      //     [
                      //         "ItemRef" =>
                      //         [
                      //             "value" => $theItemId,
                      //             "name" => $theItemName
                      //         ],
                      //         "TaxCodeRef" =>
                      //         [
                      //             "value" => "NON"
                      //         ]
                      //     ]
                      //   ],
                        [
                            "Amount" => $order['OrderTotal']['Amount'],
                            "DetailType" => "SubTotalLineDetail",
                            "SubTotalLineDetail" => []
                        ]
                    ],
                    "CustomerRef" =>
                    [
                        "value" => "18269",
                        "name" => "Amazon"
                    ]
                  ]);

                   $resultingInvoiceObj = $dataService->Add($myInvoiceObj);

           }//for

     }

$ prod_line

的var转储
array(2) { // this array layer should be stripped out
  [0]=>
  array(5) { // and this array-- just want to pass the inner contents
    ["Id"]=>
    int(1)
    ["LineNum"]=>
    int(1)
    ["Amount"]=>
    string(6) "366.97"
    ["DetailType"]=>
    string(19) "SalesItemLineDetail"
    ["SalesItemLineDetail"]=>
    array(4) {
      ["ItemRef"]=>
      array(2) {
        ["value"]=>
        string(4) "9378"
        ["name"]=>
        string(20) "Countryman E6OW5C2SR"
      }
      ["TaxCodeRef"]=>
      array(1) {
        ["value"]=>
        string(3) "NON"
      }
      ["UnitPrice"]=>
      strin

g(6) "366.97"
          ["Qty"]=>
          string(1) "1"
        }
      }
      [1]=>
      array(5) {
        ["Id"]=>
        int(2)
        ["LineNum"]=>
        int(2)
        ["Amount"]=>
        string(6) "365.81"
        ["DetailType"]=>
        string(19) "SalesItemLineDetail"
        ["SalesItemLineDetail"]=>
        array(4) {
          ["ItemRef"]=>
          array(2) {
            ["value"]=>
            string(4) "9392"
            ["name"]=>
            string(20) "Countryman E6OW5T2SR"
          }
          ["TaxCodeRef"]=>
          array(1) {
            ["value"]=>
            string(3) "NON"
          }
          ["UnitPrice"]=>
          string(6) "365.81"
          ["Qty"]=>
          string(1) "1"
        }
      }
    }

1 个答案:

答案 0 :(得分:0)

填充$prod_line项后,请再添加$prod_line[]以添加Amount数组。它不是因为它的一个数组它剥离它是因为它不是正确的结构。

你基本上在做:

<?php
$prod_line = [
    ['key' => 'value'],
    ['key' => 'value']
];

$final = [
    $prod_line,
    [
        'key' => 'value'
    ]    
];

将产生:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [key] => value
                )

            [1] => Array
                (
                    [key] => value
                )

        )

    [1] => Array
        (
            [key] => value
        )

)

这不是正确的结构。

相反,你应该在进行时构建最终的数组。

<?php
function create_qb_invoice()
{
    foreach ($az as $order_id => $order) // FOR EACH ORDER
    {
        $prod_line = [];
        $line_id = 1;

        foreach ($order['products'] as $product) // FOR EACH PRODUCTS
        {
            $prod_line[] =
                [
                "Id" => $line_id,
                "LineNum" => $line_id,
                "Amount" => $product['ItemPrice']['Amount'],
                "DetailType" => "SalesItemLineDetail",
                "SalesItemLineDetail" => [
                    "ItemRef" => [
                        "value" => $theItemId,
                        "name" => $theItemName
                    ],
                    "TaxCodeRef" => [
                        "value" => "NON"
                    ],
                    "UnitPrice" =>  $product['ItemPrice']['Amount'],
                    "Qty" => $product['QuantityOrdered'],
                ]
            ];
            $line_id++;
        }

        $prod_line[] = [
            "Amount" => $order['OrderTotal']['Amount'],
            "DetailType" => "SubTotalLineDetail",
            "SubTotalLineDetail" => []
        ]

        $myInvoiceObj = Invoice::create([
            "LinkedTxn" => [],
            "Line" => $prod_line,
            "CustomerRef" =>
            [
                "value" => "18269",
                "name" => "Amazon"
            ]
        ]);

        $resultingInvoiceObj = $dataService->Add($myInvoiceObj);

    }//for

}

可以找到此调用的正确数组结构here(中途向下):

$myInvoiceObj = Invoice::create([
  "DocNumber" => "1070",
  "LinkedTxn" => [],
  "Line" => [[
      "Id" => "1",
      "LineNum" => 1,
      "Amount" => 150.0,
      "DetailType" => "SalesItemLineDetail",
      "SalesItemLineDetail" => [
          "ItemRef" => [
              "value" => "1",
              "name" => "Services"
          ],
          "TaxCodeRef" => [
              "value" => "NON"
          ]
      ]
  ], [
      "Amount" => 150.0,
      "DetailType" => "SubTotalLineDetail",
      "SubTotalLineDetail" => []
  ]],
  "CustomerRef" => [
      "value" => "1",
      "name" => "Amy's Bird Sanctuary"
  ]
]);
$resultingInvoiceObj = $dataService->Add($myInvoiceObj);