如何对子数组进行分组并进行条件计算?
How to group subarrays and perform conditional calculations?
我需要使用 product_id
对我的子数组进行分组并执行一些条件运算。
如果 moving_type
是 1
,则当前 product_id
的总 product_number
计数应增加 product_number
。或者,如果 moving_type
是 2
,则总 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,
),
)
我需要使用 product_id
对我的子数组进行分组并执行一些条件运算。
如果 moving_type
是 1
,则当前 product_id
的总 product_number
计数应增加 product_number
。或者,如果 moving_type
是 2
,则总 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,
),
)