如何从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
    )

)

当前回答

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

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

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

其他回答

我对这个问题进行了大量的思考,并确定了最佳解决方案应该遵循两个规则。

为了可伸缩性,在适当的地方修改数组;不复制到新数组 对于性能,每个比较应该只进行一次

考虑到这一点,并考虑到PHP的所有特性,下面是我提出的解决方案。与其他一些答案不同,它能够根据您想要的任何键删除元素。输入数组应该是数字键。

$count_array = count($input);
for ($i = 0; $i < $count_array; $i++) {
    if (isset($input[$i])) {
        for ($j = $i+1; $j < $count_array; $j++) {
            if (isset($input[$j])) {
                //this is where you do your comparison for dupes
                if ($input[$i]['checksum'] == $input[$j]['checksum']) {
                    unset($input[$j]);
                }
            }
        }
    }
}

唯一的缺点是迭代完成时键不是按顺序排列的。如果你随后只使用foreach循环,这不是问题,但如果你需要使用for循环,你可以输入$input = array_values($input);上面之后要重新编号键。

如果你有一个这样的数组:

(users是数组的名称)

Array=>
 [0] => (array)
   'user' => 'john'
   'age' => '23'
 [1] => (array)
  'user' => 'jane'
  'age' => '20'
 [2]=> (array)
  'user' => 'john'
  'age' => '23'

如果你想删除重复的文件,那么:

$serialized = array();
for ($i=0; $i < sizeof($users); $i++) { 
  $test = in_array($users['user'], $serialized);
    if ($test == false) {
      $serialized[] = $users['user'];
    }
 }

可以是一个解决方案:P

很多人问我如何制作唯一的多维数组。我参考了你的评论,这对我有帮助。

首先,感谢@jeromegamez @daveilers提供的解决方案。但每次我给出答案时,他们都会问我“序列化”和“反序列化”是如何工作的。这就是为什么我想和大家分享这个原因,这样可以帮助更多的人理解这背后的概念。

我解释了为什么我们使用“serialize”和“unserialize”的步骤:

步骤1:将多维数组转换为一维数组

要将多维数组转换为一维数组,首先生成数组内所有元素(包括嵌套数组)的字节流表示。Serialize()函数可以生成值的字节流表示。为了生成所有元素的字节流表示,调用array_map()函数中的serialize()函数作为回调函数。结果将是一个一维数组,无论多维数组有多少层。

步骤2:使值唯一

要使这个一维数组唯一,请使用array_unique()函数。

步骤3:将其还原为多维数组

虽然数组现在是唯一的,但值看起来像字节流表示。要将其还原为多维数组,请使用unserialize()函数。

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

再次感谢你所做的一切。

一个简单的解决方案,可能不是最有效的:

function arrayUnique($myArray){
    if(!is_array($myArray))
        return $myArray;

    foreach ($myArray as &$myvalue){
        $myvalue=serialize($myvalue);
    }

    $myArray=array_unique($myArray);

    foreach ($myArray as &$myvalue){
        $myvalue=unserialize($myvalue);
    }

    return $myArray;

} 

对此,array_unique()文档上的用户注释提供了许多解决方案。这是其中之一:

kenrbnsn at rbnsn dot com 27-Sep-2005 12:09 Yet another Array_Unique for multi-demensioned arrays. I've only tested this on two-demensioned arrays, but it could probably be generalized for more, or made to use recursion. This function uses the serialize, array_unique, and unserialize functions to do the work. function multi_unique($array) { foreach ($array as $k=>$na) $new[$k] = serialize($na); $uniq = array_unique($new); foreach($uniq as $k=>$ser) $new1[$k] = unserialize($ser); return ($new1); }

这来自http://ca3.php.net/manual/en/function.array-unique.php#57202。