从多维数组中删除元素的重复组合

Remove duplicate combination of elements from multidimensional array

我有一个包含以下字段的数组:

$products = array(
    [0] => array('name' => 'product_one', 'category' => 'category_one', employee => '3234'),
    [1] => array('name' => 'product_two', 'category' => 'category_two', employee => '5421'),
    [2] => array('name' => 'product_three', 'category' => 'category_one', employee => '3234'),
    [3] => array('name' => 'product_one', 'category' => 'category_one', employee => '2153'),
    [4] => array('name' => 'product_one', 'category' => 'category_two', employee => '6312')        
)

现在,在这种情况下,employee 字段并不重要,但 product/category 的组合是唯一的。

想要的结果:

$products = array(
    [0] => array('name' => 'product_one', 'category' => 'category_one', employee => '3234'),
    [1] => array('name' => 'product_two', 'category' => 'category_two', employee => '5421'),
    [2] => array('name' => 'product_three', 'category' => 'category_one', employee => '3234'),
    [4] => array('name' => 'product_one', 'category' => 'category_two', employee => '6312')        
)

知道最好的方法是什么吗?在生产中,我有超过 30.000 个元素,通常大约有 10 个重复项。同样在真实数据库中,我有 12 个字段,其中 4 个的组合需要是唯一的。

如果您不介意保留哪些重复项,可能最简单的方法是遍历循环,创建一个新数组,其中的键是所需唯一值的组合(我使用了分隔符## 在此代码中,您可以使用值中 不能 出现的任何内容)。这样重复项将被自动删除,因为数组不能有相同的键。循环完成后,可以使用 array_values:

以数字方式重新索引输出数组
$output = array();
foreach ($products as $p) {
    $output["{$p['name']}##{$p['category']}"] = $p;
}

$output = array_values($output);
print_r($output);

输出(对于您的示例数据):

Array
(
    [0] => Array
        (
            [name] => product_one
            [category] => category_one
            [employee] => 2153
        )
    [1] => Array
        (
            [name] => product_two
            [category] => category_two
            [employee] => 5421
        )
    [2] => Array
        (
            [name] => product_three
            [category] => category_one
            [employee] => 3234
        )
    [3] => Array
        (
            [name] => product_one
            [category] => category_two
            [employee] => 6312
        )
)

Demo on 3v4l.org