Как сгруппировать подмассивы и выполнить условные вычисления?

Мне нужно сгруппировать мой подмассив, используя 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
)
)

1

Решение

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

Другие решения

Вы могли бы использовать 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
)

)
0

Ты можешь использовать 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
)

)
0
По вопросам рекламы [email protected]