如何从PHP多维数组中删除重复值?

示例数组:

Array
(
    [0] => Array
    (
        [0] => abc
        [1] => def
    )

    [1] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [2] => Array
    (
        [0] => mno
        [1] => pql
    )

    [3] => Array
    (
        [0] => abc
        [1] => def
    )

    [4] => Array
    (
        [0] => ghi
        [1] => jkl
    )

    [5] => Array
    (
        [0] => mno
        [1] => pql
    )

)

当前回答

这个解决方案只在一个数组列需要唯一性时才有用,例如,如果我们需要数组索引#0中的唯一性。

解决方案1:

使用array_filter和一个匿名函数和一个静态变量:

<?php

$list = [
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql'],
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql']
];

$list = array_filter($list, function ($item) {
    static $values = [];
    if (!in_array($item[0], $values)) {
        $values[] = $item[0];
        return true;
    } else {
        return false;
    }
});

var_dump($list);

解决方案2:

由于我们想要唯一性的值是字符串类型,我们可以重新映射原始全局数组,使用这些值作为键,这将在我们重新映射时删除重复的值:

<?php

$list = [
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql'],
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql']
];

$unique = [];

foreach ($list as $item) {
    $unique[$item[0]] = $item;
}

// Remap again to integers
$unique = array_values($unique);

var_dump($unique);

其他回答

对于长度不受限制的(n)维数组,尝试此解决方案 比如这个数组

$arr= [
0 => [0=>"a" , 1=>"b" ,  2=>"c" ] ,
1 => [0=>"x" , 1=>"b" , 2=>"a", 3=>"p"],
2=>   [
       [ 
          0=>"y" ,
          1=>"b" ,
          2=> [0=>"x" , 1=>"m" , 2=>"a"]
       ],
       1=>"z" ,
       2=>"v"
       ]
     ];

这就是答案

$ar2=[];
$ar3=[];
function test($arr){
    
    global $ar2,$ar3;
    if(is_array($arr)){
       return array_map("test",$arr);
    }
    if(!isset($ar2[$arr])){
        $ar2[$arr]=1;
        $ar3[]=$arr;
    }
}
array_map("test",$arr);
print_r($ar3);

这里有另一种方法。不保存中间变量。

我们使用它来消除来自各种重叠查询的重复结果。

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));

这个解决方案只在一个数组列需要唯一性时才有用,例如,如果我们需要数组索引#0中的唯一性。

解决方案1:

使用array_filter和一个匿名函数和一个静态变量:

<?php

$list = [
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql'],
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql']
];

$list = array_filter($list, function ($item) {
    static $values = [];
    if (!in_array($item[0], $values)) {
        $values[] = $item[0];
        return true;
    } else {
        return false;
    }
});

var_dump($list);

解决方案2:

由于我们想要唯一性的值是字符串类型,我们可以重新映射原始全局数组,使用这些值作为键,这将在我们重新映射时删除重复的值:

<?php

$list = [
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql'],
    ['abc', 'def'],
    ['ghi', 'jkl'],
    ['mno', 'pql']
];

$unique = [];

foreach ($list as $item) {
    $unique[$item[0]] = $item;
}

// Remap again to integers
$unique = array_values($unique);

var_dump($unique);
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => john
        )

    [1] => Array
        (
            [id] => 2
            [name] => smith
        )

    [2] => Array
        (
            [id] => 3
            [name] => john
        )

    [3] => Array
        (
            [id] => 4
            [name] => robert
        )

)

$temp = array_unique(array_column($array, 'name'));
$unique_arr = array_intersect_key($array, $temp);

这将从数组中删除重复的名称。按键唯一

正如人们所说,array_unique()非常慢,下面是我用于一个层次的多维数组的代码片段。

$serialized_array = array_map("serialize", $input);

foreach ($serialized_array as $key => $val) {
     $result[$val] = true;
}

$output = array_map("unserialize", (array_keys($result)));

在php.net中引用array_unique()函数页面的第一个用户贡献的注释