Как сгруппировать подмассивы и выполнить условные вычисления? - PullRequest
0 голосов
/ 06 мая 2018

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

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

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

)
...