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

У меня есть многомерный массив, как показано ниже,

$product = array(
"2e471a22b1b994a7cb3f3a40cee9fba2" => array (
"product" => 6004,
"unique_key" => 3a8a5cb029ee3b92cfc90de23e2329ab,
"product_id" => 51,
"line_total"=>99,
"quantity"=>1,
"data"=> array(
"id"=> 51,
"post"=>array(
"ID"=>51,
"post_title"=>"Prodcut four - control",
),
"price"=>99
)
),
"a7d0f813832ec8a2bf24269ff7145d0c" => array (
"product" => 6004,
"unique_key" => c30d1ca26d30aa3dc3c9aa04f0b585ce,
"product_id" => 51,
"line_total"=>99,
"quantity"=>1,
"data"=> array(
"id"=> 51,
"post"=>array(
"ID"=>51,
"post_title"=>"Prodcut four - control",
),
"price"=>99
)
)
);

Необходимо удалить дубликаты значений на основе значения массива product_id и увеличить количество значений на основе количества продуктов.
Примечание. В приведенном выше массиве также есть «уникальный ключ», поэтому для результата массива требуется любой отдельный уникальный ключ.

Expected Result should be:
$resultproduct = array(
"2e471a22b1b994a7cb3f3a40cee9fba2" => array (
"product" => 6004,
"unique_key" => 3a8a5cb029ee3b92cfc90de23e2329ab,
"product_id" => 51,
"line_total"=>99,
"quantity"=>2,
"data"=> array(
"id"=> 51,
"post"=>array(
"ID"=>51,
"post_title"=>"Prodcut four - control",
),
"price"=>99
)
));

1

Решение

Рабочий код на eval.in

Я стараюсь сделать код легким для понимания, чтобы было больше переменных и строк кода, чем это абсолютно необходимо.

Объяснение:

1) Нужно использовать тот из оригинала product индекс массива в качестве ключа выходной таблицы, например «2e471a22b1b994a7cb3f3a40cee9fba2» для продукта 51.

2) Необходимо быстро связать входной productId с ключом вывода. Итак, я использовал таблицу поиска ProductIdList это соответствует productId в output ключ.

Затем выполняется двухэтапный поиск, чтобы найти запись в выходных данных и добавить к ней количество.

Код:

// create a product_id => first key table
$productIdList = array();

// output...
$productTotal = array();

foreach ($product as $origIndex => $entry) {

$curProductId = $entry['product_id'];

// check product_id exists in the lookup...
if (isset($productIdList[$curProductId])) { // add to the total...

$productTotalIndex = $productIdList[$curProductId];

$productTotal[$productTotalIndex]['quantity'] +=  $entry['quantity'];
}
else { // add the entry to the output and the productIdList...

$productIdList[$curProductId] = $origIndex;

$productTotal[$origIndex] = $entry;
}
}

Вывод: итоговый массив:

Array
(
[2e471a22b1b994a7cb3f3a40cee9fba2] => Array
(
[product] => 6004
[unique_key] => 3a8a5cb029ee3b92cfc90de23e2329ab
[product_id] => 51
[line_total] => 99
[quantity] => 2
[data] => Array
(
[id] => 51
[post] => Array
(
[ID] => 51
[post_title] => Prodcut four - control
)
[price] => 99
)
)

[test02] => Array
(
[product] => 6664
[unique_key] => c30d1ca26d30aa3dc3c9aa04f0b585ce
[product_id] => 666
[line_total] => 99
[quantity] => 579
[data] => Array
(
[id] => 666
[post] => Array
(
[ID] => 666
[post_title] => Prodcut 666 - control
)
[price] => 99
)
)
)

ProductId к оригинальному списку ключей:

array (size=2)
51 => string '2e471a22b1b994a7cb3f3a40cee9fba2' (length=32)
666 => string 'test02' (length=6)
0

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

Вам нужно перебрать каждый продукт и использовать product_id в качестве ключа для нового массива. Это добавляет количество по мере необходимости, поэтому должно работать для любых количеств, кроме 1.

$result = [];

foreach ($product as $p)
{
if (isset($result[$p['product_id']]))
{
$result[$p['product_id']]['quantity']+= $p['quantity'];
}

else
{
$result[$p['product_id']] = $p;
}
}

print_r($result);
0