Как найти двойные значения в массиве и объединить двойные значения

#php #arrays

#php #массивы

Вопрос:

Я работаю над способом фильтрации двойных значений, поскольку мой пример ниже показывает, что в массиве присутствуют продукты, которые в основном двойные и должны быть объединены (создайте новый ключ с объединенными значениями).

Продукт должен быть объединен по api_id.

 //old current array
[products] => Array
    (
        [product_5c7fb5f72f9d5_192] => Array
            (
                [record_id] => 84721
                [api_id] => 192
                [amount] => 12
                [cost_price] => 3.36
            )
        [product_5c7fb5f72fe49_192] => Array
            (
                [record_id] => 84722
                [api_id] => 177
                [amount] => 1
                [cost_price] => 1.09
            )
        [product_5c7fb5f7301b2_192] => Array
            (
                [record_id] => 84724
                [api_id] => 192
                [amount] => 24
                [cost_price] => 6.72
            )
        [product_5c7fb5f7301b2_192] => Array
            (
                [record_id] => 84725
                [api_id] => 192
                [amount] => 24
                [cost_price] => 6.72
            )
    )

// this should be new new array
[products] => Array
    (
        [product_5c7fb5f72f9d5_192] => Array
            (
                [record_id] => 84721
                [api_id] => 192
                [amount] => 60//new value
                [cost_price] => 16.8//new value
            )
        [product_5c7fb5f72fe49_192] => Array
            (
                [record_id] => 84722
                [api_id] => 177
                [amount] => 1
                [cost_price] => 1.09
            )

    )
  

Комментарии:

1. И в чем проблема? Вы что-нибудь пробовали?

Ответ №1:

Вы можете использовать array_reduce :

 $products = array_reduce($products, function ($carry, $product) {
    if (!isset($carry[$product['api_id']])) {
        $carry[$product['api_id']] = $product;
    }
    else {
        $carry[$product['api_id']]['amount']  = $product['amount'];
        $carry[$product['api_id']]['cost_price']  = $product['cost_price'];
    }

    return $carry;
}, []);
  

Комментарии:

1. хорошее решение, никогда не слышал о array_reduce раньше