PHP - 将对象添加到子数组中

时间:2018-06-13 09:10:19

标签: php arrays object sub-array

我有包含订单行的传入数据,订单可能有多行。我需要解析它并将其转换为具有行的子数组的单个对象。

所以我正在做的是循环遍历订单行,在第一次出现我创建的“订单ID”和对象时,然后在每个循环中通过数据检查我是否存在“订单ID”,如果它然后我想将数据添加到子数组。因为我不能确定订单ID可能不会在另一个字段中重复(它只是一个int)我创建了一个唯一的标识符来匹配。

             foreach ($orderList as $result) {
                // create the unique identifier
                $system_check = md5($result['order_id'] . $result['email']);

                // create a sting to search in, "in_array" not working
                $str = json_encode($parsedOrders);

                // Check if this is this order is already in the parsedOrder onject
                if (strpos($str, $system_check) !== false) {

                    // debug logging
                    $this->ICLogger("info", "parsed order line:", json_encode($parsedOrders[$result['order_id']]['lines']));

                    // trying to array_push the data into the "lines" section
                    $parsedOrders[$result['order_id']]['lines'][] = array(
                        'id' => $result['line_id'],
                        'product_id' => $result['product_id'],
                        'product_variant_id' => $result['product_variant_id'],
                        'quantity' => $result['quantity'],
                        'price' => $result['price']
                    );
                } else {

                    // Create the order "header" and "lines" data
                    $parsedOrders[$result['order_id']] = array
                    (
                        'id' => $result['order_id'],
                        'search_term' => $system_check,
                        'customer' => array(
                            'id' => $result['customer_id'],
                            'email_address' => $result['email'],
                            'opt_in_status' => ((int)$result['newsletter'] === 1)
                        ),
                        'fulfillment_status' => (!empty($order['fulfillment_status']) ? $order['fulfillment_status'] : ''),
                        'financial_status' => (!empty($order['financial_status']) ? $order['financial_status'] : ''),
                        'landing_site' => (!empty($order['landing_site']) ? $order['landing_site'] : ''),
                        'currency_code' => $result['currency_code'],
                        'order_total' => $result['order_total'],
                        'tax_total' => $result['tax_total'],
                        'storeid' => $result['storeid'], // temp storage of store ID
                        'lines' => array(array(
                            'id' => $result['line_id'],
                            'product_id' => $result['product_id'],
                            'product_variant_id' => $result['product_variant_id'],
                            'quantity' => (int)$result['quantity'],
                            'price' => $result['price']
                        ))
                    );
                }

当我这样做时,数据只是添加到数组的末尾,而不是我想要添加到的对象内部:

JSON编码输出:

    [
      {
        "id":"20007",
        "search_term":"2d8a9bbbbc85d4503b8581bb09d81301",
        "customer":{
        "id":"11",
        "email_address":"test103@test.com",
        "opt_in_status":false
      },
        "fulfillment_status":"",
        "financial_status":"",
        "landing_site":"",
        "currency_code":"GBP",
        "order_total":"4",
        "tax_total":"1.3199999999999998",
        "storeid":"1",
        "lines":[
          {
            "id":"13",
            "product_id":"123",
            "product_variant_id":"750",
            "quantity":1,
            "price":"1"
          }
        ]
      },
      {
        "lines":[
          {
            "id":"14",
            "product_id":"123",
            "product_variant_id":"752",
            "quantity":"1",
            "price":"1"
          }
        ]
      }
    ]

如何将“lines”附加到“lines”数组而不只是附加到对象的末尾?

非常感谢......

2 个答案:

答案 0 :(得分:0)

您应该在foreach循环之外创建parsedOrders数组。然后,您可以按如下方式追加对象:

<?php

$parsedOrders = [
    'yourdata' => '...',
    'lines' => [],
];

foreach ($orderList as $order) {
    $order = 'yourdata';
    $parsedOrders['lines'][] = $order; // append the order
}

答案 1 :(得分:0)

你几乎在那里你刚刚对你的括号感到困惑我会建议把它简化为更像

$parsedOrders = [];
foreach ($orderList as $result) {

    if(isset($parsedOrders[$result['order_id']]))
    {
        //grab the existing order
        $order = $parsedOrders[$result['order_id']];
    }
    else
    {
        //if order doesn't exist create
        $order = [
            'id' => $result['order_id'],
            'search_term' => $system_check,
            'customer' => [
                'id' => $result['customer_id'],
                'email_address' => $result['email'],
                'opt_in_status' => ((int)$result['newsletter'] === 1)
            ],
            'fulfillment_status' => (!empty($order['fulfillment_status']) ? $order['fulfillment_status'] : ''),
            'financial_status' => (!empty($order['financial_status']) ? $order['financial_status'] : ''),
            'landing_site' => (!empty($order['landing_site']) ? $order['landing_site'] : ''),
            'currency_code' => $result['currency_code'],
            'order_total' => $result['order_total'],
            'tax_total' => $result['tax_total'],
            'storeid' => $result['storeid'], // temp storage of store ID
            'lines' => []
        ];

    }

    $order['lines'][$result['line_id']] = [
        'id' => $result['line_id'],
        'product_id' => $result['product_id'],
        'product_variant_id' => $result['product_variant_id'],
        'quantity' => (int)$result['quantity'],
        'price' => $result['price']
    ]

     $parsedOrders[$result['order_id']] = $order;
}