在PHP中删除关联数组中重复的元素

48
$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other'),
);
如果有重复的,请将其删除,结果如下:
$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other')   
);

有人知道如何做这个吗?

谢谢


什么会使得 a=b=other 重复,或者只是 b=other 就可以了呢? - Baba
ab @Bada 谢谢 - tree em
http://stackoverflow.com/questions/3767318/how-to-remove-duplicate-values-from-an-associative-array-based-on-a-specific-val - rOcKiNg RhO
2个回答

91

不管别人在这里提供什么,你正在寻找一个名为array_uniqueDocs的函数。这里重要的是将第二个参数设置为SORT_REGULAR,然后工作就容易了:

array_unique($result, SORT_REGULAR);

SORT_REGULAR 标志的意思是:

普通比较(不改变类型)

这正是您想要的。您希望在此处比较数组文档,并且不更改它们的类型为字符串(如果未设置参数,则默认为字符串)。

array_unique 执行严格比较(在 PHP 中是 ===),对于数组来说,这意味着:

$a === $b 如果 $a 和 $b 具有相同的键值对、相同的顺序和相同的类型,则返回 TRUE

输出结果(演示):

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )
)

很酷,我不知道在al.l中还有第二个参数可用。 - David Müller
1
@DavidMüller:手册总是值得一看的;)至少这是我在需要具体了解时的做法。你不可能对每个函数都了如指掌。 - hakre
对我有用,谢谢。 - Shahrukh Anwar
1
它似乎对我没有起作用。我仍然在这上面得到重复的结果。 - Tyler Lazenby
1
除了这个解决方案之外,您还可以使用array_values()重新调整数组键。只需执行array_values(array_unique($result, SORT_REGULAR))即可。 - Luciano

29

首先,为了解决这个问题,您不能仅使用普通的array_unique函数,因为其在内部将数组项视为字符串处理,这就是为什么在使用array_unique时会出现“无法将数组转换为字符串”的错误提示。

因此,请尝试以下方法:

$result = array(
    0=>array('a'=>1,'b'=>'Hello'),
    1=>array('a'=>1,'b'=>'other'),
    2=>array('a'=>1,'b'=>'other')
);

$unique = array_map("unserialize", array_unique(array_map("serialize", $result)));

print_r($unique);

结果:

Array
(
    [0] => Array
        (
            [a] => 1
            [b] => Hello
        )

    [1] => Array
        (
            [a] => 1
            [b] => other
        )

)

序列化对于这种问题非常方便。

如果您觉得这对你来说有些 魔幻,请看看这篇博客文章

function array_multi_unique($multiArray){

  $uniqueArray = array();

  foreach($multiArray as $subArray){

    if(!in_array($subArray, $uniqueArray)){
      $uniqueArray[] = $subArray;
    }
  }
  return $uniqueArray;
}

$unique = array_multi_unique($result);

print_r($unique);

具有讽刺意味的是,in_array 适用于数组,而 array_unique 却不适用。


4
实际上,array_unique 就可以了。看看我的回答:https://dev59.com/ImYr5IYBdhLWcg3wOXsQ#13860140 - hakre
如果您希望结果与输入格式相同(不包括整数键),那么这就是答案。 - Vahid Amiri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接