我需要使用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
)
)发布于 2018-05-06 08:41:40
最有效地使用基于product_id的临时键来确定您是在两个值之间执行算术,还是仅仅声明product_id的第一个出现的值。
如果这是第一次出现,只需将前三行从行中切片,并保留键(这是true部分)。
如果这不是product_id的第一次出现,那么您只需要更新product_number元素。根据moving_type值确定正确的操作--使用该值,将product_number乘以1或-1,并将生成的值添加到存储的值中。
循环完成后,可以使用array_values()重新索引结果数组。
代码:(演示)
$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,
),
)发布于 2018-05-06 08:14:08
您可以使用foreach()循环。在其中,您可以使用product_id作为键创建一个新数组。您可以使用*=-1更改product_number的符号,如果键已经存在,则将当前的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
)
)https://stackoverflow.com/questions/50197496
复制相似问题