根据条件结果在foreach循环中递增计数器


Increment counter in a foreach loop depending on condition result

我有一个从mysql查询生成的数组,如下所示。它们的关键是order_id值。

订单阵列

Array
(
    [2646] => Array
        (
            [order_id] => 2646
        )
    [2647] => Array
        (
            [order_id] => 2647
        )
    [2650] => Array
        (
            [order_id] => 2650
        )
    [2658] => Array
        (
            [order_id] => 2658
        )
)

我正在考虑将项目添加到数组的每一行,其中包含来自另一个数组的项目,看起来像。

order_items数组

Array
(
    [0] => Array
        (
            [order_id] => 2646
            [prod_code] => 2811
            [order_qty] => 1
        )
    [1] => Array
        (
            [order_id] => 2646
            [prod_code] => 2812A
            [order_qty] => 3
        )
    [2] => Array
        (
            [order_id] => 2647
            [prod_code] => 2812A
            [order_qty] => 2
        )
    [3] => Array
        (
            [order_id] => 2647
            [prod_code] => 2810
            [order_qty] => 2
        )
    [4] => Array
        (
            [order_id] => 2650
            [prod_code] => 2906
            [order_qty] => 1
        )
    [5] => Array
        (
            [order_id] => 2650
            [prod_code] => 2908
            [order_qty] => 6
        )
    [6] => Array
        (
            [order_id] => 2650
            [prod_code] => 2909
            [order_qty] => 3
        )
    [7] => Array
        (
            [order_id] => 2650
            [prod_code] => 2913
            [order_qty] => 1
        )
    [8] => Array
        (
            [order_id] => 2658
            [prod_code] => 2880
            [order_qty] => 3
        )
    [9] => Array
        (
            [order_id] => 2658
            [prod_code] => 2881
            [order_qty] => 3
        )
    [10] => Array
        (
            [order_id] => 2658
            [prod_code] => 2882
            [order_qty] => 1
        )
)

我在计算如何在order_items数组上循环并将prod_codeorder_qty值插入order数组中order_id值匹配时遇到的问题。这是我迄今为止所拥有的。

// create orders array - key by order_id
while ($order = mysqli_fetch_assoc($order_rows)) {
    $orders[$order['order_id']] = $order;
}
// create the order_items array
while ($item = mysqli_fetch_assoc($item_rows)) {
    $order_items[] = $item;
}
// update orders array with ordered items
$item_index = 1;
foreach ($order_items as $key => $value) {
    // get the order id
    $item_order_id = $value['order_id'];
    // update orders array with ordered items grouped by order_id
    if ($item_order_id == $orders[$item_order_id]['order_id']) {
        $orders[$item_order_id]['prod_code_'.$item_index] = $value['prod_code'];
        $orders[$item_order_id]['order_qty_'.$item_index] = $value['order_qty'];
        // same order id so increment the counter
        $item_index++;
    } else {
        // new order id start at 1
        $item_index = 1;
    }
}

我的问题是,当我们查看新的item_order_id时,计数器不会重置回1。

我试图为我的数组实现的输出是这样的。

所需订单阵列输出

Array
(
    [2646] => Array
        (
            [order_id] => 2646
            [prod_code_1] => 2811
            [order_qty_1] => 1
            [prod_code_2] => 2812A
            [order_qty_2] => 3
        )
    [2647] => Array
        (
            [order_id] => 2647
            [prod_code_1] => 2812A
            [order_qty_1] => 2
            [prod_code_2] => 2810
            [order_qty_2] => 2
        )
    [2650] => Array
        (
            [order_id] => 2650
            [prod_code_1] => 2906
            [order_qty_1] => 1
            [prod_code_2] => 2908
            [order_qty_2] => 6
            [prod_code_3] => 2909
            [order_qty_3] => 3
            [prod_code_4] => 2913
            [order_qty_4] => 1
        )
    [2658] => Array
        (
            [order_id] => 2658
            [prod_code_1] => 2880
            [order_qty_1] => 3
            [prod_code_2] => 2881
            [order_qty_2] => 3
            [prod_code_3] => 2882
            [order_qty_3] => 1
        )
)

非常感谢任何反馈或协助。

您可以进行两次传递:

  1. 按订单id聚合订单项
  2. 构造最终输出

第一次通过

// create the order_items array
while ($item = mysqli_fetch_assoc($item_rows)) {
    $order_items[$item['order_id']][] = $item;
}

第二遍

foreach($order_items as $order_id => $order_items) {
    $record = ['order_id' => $order_id];
    // add order items
    foreach($order_items as $index => $order_item) {
        foreach ($order_item as $attribute_name => $attribute_value) {
            $key = sprintf('%s_%d', $attribute_name, $index + 1);
            $record[$key] = $attribute_value;
        }
    }
    // generate csv row with record here
}