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


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

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

中eval.in的工作代码

我试图让代码更容易理解,这样就有了比绝对需要的更多的变量和代码行。

说明:

1) 需要使用原始product数组索引中的一个作为输出表键,例如产品51的"2e471a22b1b994a7cb3f3a40ce9fba2"。

2) 它需要快速将输入productId与输出键关联起来。因此,我使用了一个查找表ProductIdList,它将productIdoutput关键字相匹配。

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

代码:

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

您需要在每个产品上循环,并使用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);