Мне нужно сгруппировать мой подмассив, используя product_id
и выполнить некоторую условную арифметику.
Если moving_type
является 1
тогда общий product_number
подсчет на текущий product_id
должно быть увеличено на 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
)
)
Наиболее эффективно использовать временные ключи на основе 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,
),
)
Вы могли бы использовать foreach()
петля. Внутри вы можете создать новый массив, используя product_id
в качестве ключа. Вы могли бы использовать *=-1
изменить знак 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
)
)
Ты можешь использовать array_reduce
суммировать массив в ассоциативный массив. И использовать array_values
преобразовать ассоциативный массив в простой массив.
$arr = array(); //Your array
$result = array_values(array_reduce($arr, function($c, $v){
$type = $v["moving_type"];
unset( $v["moving_type"] );
//If product_id does not exist yet. Inititate. And set the product_number to 0
if ( !isset( $c[$v["product_id"]] ) ) {
$c[$v["product_id"]] = $v;
$c[$v["product_id"]]["product_number"] = 0;
}
//If moving_type === 1, add the product_number
//Else, ( moving_type === 2 ), deduct the product_number
if ( $type === 1 ) $c[$v["product_id"]]["product_number"] += $v["product_number"];
else $c[$v["product_id"]]["product_number"] -= $v["product_number"];
return $c;
}, array()));
echo "<pre>";
print_r( $result );
echo "</pre>";
Это приведет к:
Array
(
[0] => Array
(
[id] => 1
[product_id] => 4
[product_number] => 10
)
[1] => Array
(
[id] => 1
[product_id] => 5
[product_number] => 8
)
)