Наиболее эффективно использовать временные ключи на основе 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,
),
)