如何对子数组进行分组并进行条件计算?

How to group subarrays and perform conditional calculations?

我需要使用 product_id 对我的子数组进行分组并执行一些条件运算。

如果 moving_type1,则当前 product_id 的总 product_number 计数应增加 product_number。或者,如果 moving_type2,则总 product_number 计数应减少 product_number 值。

这是我的输入数组:

Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
            [moving_type] => 1
        )

    [1] => Array
        (
            [id] => 1
            [product_id] => 5
            [product_number] => 10
            [moving_type] => 1 // product addition
        )

    [2] => Array
        (
           [id] => 1
            [product_id] => 5
            [product_number] => 2
            [moving_type] => 2 // product minus
        )
)

我想要的结果是:

Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
        )

    [1] => Array
        (
            [id] => 1
            [product_id] => 5
            [product_number] => 8 // as 10-2
         )
)

您可以使用 foreach() 循环。在其中,您可以使用 product_id 作为键创建一个新数组。您可以使用 *=-1 更改 product_number 的符号,如果密钥已经存在,则将当前的 product_number 添加到现有的

$array = array(
     array('id' => 1, 'product_id' => 4, 'product_number' => 10, 'moving_type' => 1),
     array('id' => 1, 'product_id' => 5, 'product_number' => 10, 'moving_type' => 1),
     array('id' => 1, 'product_id' => 5, 'product_number' => 2, 'moving_type' => 2)
);

$final = [];
foreach ($array as $item) {
    $pid = $item['product_id'] ;
    if ($item['moving_type'] == 2) $item['product_number'] *= -1;
    unset($item['moving_type']);

    if (!isset($final[$pid])) { $final[$pid] = $item ; }
    else {
        $final[$pid]['product_number'] += $item['product_number'] ;
    }
}
$final = array_values($final);
print_r($final);

输出:

Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
        )

    [1] => Array
        (
            [id] => 1
            [product_id] => 5
            [product_number] => 8
        )

)

最有效地使用基于 product_id 的临时键来确定您是在两个值之间执行算术运算还是仅声明 product_id.

的第一个出现的值

如果是第一次出现,只需将前三行切掉并保留键(即 true 部分)。

如果 product_id 不是第一次出现,那么您只需更新 product_number 元素。根据 moving_type 值确定正确的操作——使用它,将 product_number 乘以 1-1 并将生成的值添加到存储值。

循环完成后,您可以使用 array_values() 重新索引结果数组。

代码:(Demo)

$array = [
     ['id' => 1, 'product_id' => 4, 'product_number' => 10, 'moving_type' => 1],
     ['id' => 1, 'product_id' => 5, 'product_number' => 10, 'moving_type' => 1],
     ['id' => 1, 'product_id' => 5, 'product_number' => 2, 'moving_type' => 2]
];

foreach ($array as $row) {
    if (!isset($result[$row['product_id']])) {
        $result[$row['product_id']] = array_slice($row, 0, 3, true);
    } else {
        $result[$row['product_id']]['product_number'] += ($row['moving_type'] == 1 ? 1 : -1) * $row['product_number'];
    }
}

var_export(array_values($result));

输出:

array (
  0 => 
  array (
    'id' => 1,
    'product_id' => 4,
    'product_number' => 10,
  ),
  1 => 
  array (
    'id' => 1,
    'product_id' => 5,
    'product_number' => 8,
  ),
)