PHP 获取多维数组中的唯一值

32

可能是重复问题:
php多维数组去重

我有一个这样的数组:

$a = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ),  
    2 => array ( 'value' => 'Australia', ), 
    3 => array ( 'value' => 'America', ), 
    4 => array ( 'value' => 'England', ), 
    5 => array ( 'value' => 'Canada', ), 
)

我该如何去除重复的值以获得下面的结果:

$a = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ),  
    2 => array ( 'value' => 'Australia', ), 
    4 => array ( 'value' => 'Canada', ), 
)

我尝试使用array_unique函数,但由于这个数组是多维的,所以无法生效。

编辑:我还需要这个数组是多维的,并且以这种格式存在,我不能将其压平。


13
具有讽刺意味的是,有多个重复的问题:http://stackoverflow.com/search?q=php+array+duplicate - Andy E
3
它们都非常不同?请告诉我哪个答案涉及到多维数组的问题。 - Mark
有很多种方法,一些适用于多维数组,一些适用于单维数组。我特别投票关闭的是:https://dev59.com/73I-5IYBdhLWcg3wbHq-,几乎是完全相同的问题(基于子元素值删除元素)。请不要个人攻击。如果没有数百个重复的问题,SO会更有效率。 - Andy E
3个回答

86

array_unique在查找唯一值之前使用类型转换将值转换为字符串进行比较:

注意: 仅当(string) $elem1 === (string) $elem2即字符串表示相同时,两个元素被认为是相等的。第一个元素将被使用。

但是一个数组总是会被转换成Array

var_dump("Array" === (string) array());

您可以通过在array_unique的第二个参数中指定SORT_REGULAR模式来解决此问题:

$unique = array_unique($a, SORT_REGULAR);

或者,如果那个方法不奏效,可以在调用 array_unique 函数之前对数组进行序列化,然后再进行反序列化以找到唯一值:

$unique = array_map('unserialize', array_unique(array_map('serialize', $a)));

这就是为什么你需要SORT_REGULAR标志,以防止数组转换为字符串。至少在理论上是这样的。 - Sejanus
@Sejanus:我也是这么想的。但似乎对马克不起作用。因此,我提出了另一种解决方案。 - Gumbo
我喜欢这样简单的解决方案,本以为要用很多循环才能解决。谢谢! - Daniel West
最后的解决方案对我非常有帮助,谢谢。 - technology_dreamer
这太棒了,我已经寻找它一段时间了。 - Ole_S
嘿,试试这个一行代码:$input = array_map('unserialize', array_unique(array_map('serialize', $input)));https://dev59.com/OXVC5IYBdhLWcg3wZwNT#946300 - Heitor

10

在这里 :)

<?php
 $a = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ),  
    2 => array ( 'value' => 'Australia', ), 
    3 => array ( 'value' => 'America', ), 
    4 => array ( 'value' => 'England', ), 
    5 => array ( 'value' => 'Canada', ), 
);

$tmp = array ();

foreach ($a as $row) 
    if (!in_array($row,$tmp)) array_push($tmp,$row);

print_r ($tmp);
?>

1
根据php.net,最好使用$tmp[] = $row而不是array_push($tmp, $row)。否则:回答很好。 - middus
啊,你说得对,但现在我有点疑惑,为什么我要使用array_push呢? :D 哈哈 - Marcx
array_push() 在以下情况下非常有用:如果您想一次将多个元素推入数组中,或者您想使用函数提供的返回值(数组计数)。否则,我建议使用 []。通常在循环中使用 in_array() 是一个不好的主意。 - mickmackusa

1

使用SORT_REGULAR标志。

$unique_array = array_unique($a, SORT_REGULAR);

我不确定为什么它有帮助,但它确实有用。至少在php 5.3中是这样的。


4
从 PHP 文档中:**注意:** 请注意,array_unique() 不适用于多维数组。 - Andy E
哦,我用的是5.2版本,它对我不起作用。 - Mark
在这种情况下,你可能需要编写自己的函数。 - Sejanus

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