【问题标题】:Increment counter in a foreach loop depending on condition result根据条件结果在 foreach 循环中递增计数器
【发布时间】:2015-05-19 22:18:54
【问题描述】:

我有一个从 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
        )

)

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

【问题讨论】:

  • [prod_code_1], [prod_code_2].... eww.... 为什么不[prod_code] => array(2906, 2908, 2909, 2913)
  • 最终的数组将被保存到一个文本文件(csv)中,这是第三方应用程序需要结构化数据的格式。

标签: php arrays foreach while-loop


【解决方案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
}

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2021-01-13
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多