如何从所有数组中具有单个唯一值的多维数组中删除重复值

How to Remove duplicate values from Multidimentional array with single unique value in all array

我有如下的多维数组,

$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'数组值的重复值,并根据产品数量增加数量值。 注意:上面的数组也有 'unique key' 所以数组结果中需要任何一个唯一的键。

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    
    )
        ));

您需要遍历每个产品并使用 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);

Working code at eval.in

我尝试让代码易于理解,因此变量和代码行比绝对需要的多。

解释:

1) 需要使用原始 product 数组索引之一作为输出 table 键 e.g.产品 51 的“2e471a22b1b994a7cb3f3a40cee9fba2”。

2) 需要快速将输入的productId 关联到输出的key。因此,我使用了匹配 productIdoutput 键的查找 table ProductIdList

然后是两阶段查找,以在输出中找到条目并向其添加数量。

代码:

// 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)