2010-03-14 51 views
32

可能重复:
php multi-dimensional array remove duplicatePHP得到一个多维数组的唯一值

我有一个这样的数组:

$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 – 2010-03-14 13:17:48

+3

他们都是完全不同的?告诉我哪些答案是多维数组的问题。 – Mark 2010-03-14 13:25:55

+0

有很多,一些用于多维数组,一些用于一维数组。我特别投票关闭的是:http://stackoverflow.com/questions/1861682/php-multi-dimensional-array-remove-duplicate,这几乎是完全相同的问题(删除基于子元素的元素值)。请不要亲自采取。如果没有数百个重复的问题,它对于SO更好。 – 2010-03-14 13:52:24

回答

85

array_unique是使用比较值找到唯一值之前字符串转换:

注意:有两个因素被认为是平等的,如果并且只有在(string) $elem1 === (string) $elem2。用词表示:当字符串表示是相同的。第一个元素将被使用。

但数组总是会转换为Array

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

就可以解决这个通过在array_unique第二个参数指定SORT_REGULAR模式:

$unique = array_unique($a, SORT_REGULAR); 

或者,如果那是行不通的,serializing之前的阵列和unserializing之后它叫array_unique找到独特的价值观:

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

好的解决方案。谢谢。 – Mark 2010-03-14 13:47:18

+0

这就是为什么你需要SORT_REGULAR标志,以防止数组转换为字符串。理论上,至少。 – Sejanus 2010-03-14 13:51:27

+0

@Sejanus:这也是我的想法。但它似乎并不适用于马克。所以我提出了另一种解决方案。 – Gumbo 2010-03-14 14:09:07

1

使用SORT_REGULAR标志。

$unique_array = array_unique($a, SORT_REGULAR); 

我不知道为什么它帮助,但它确实。至少在PHP 5.3

+2

从PHP文档:**'注意:'**'请注意,array_unique()不适用于多维数组。' – 2010-03-14 13:25:49

+0

哦,我在5.2上,它不适合我。 – Mark 2010-03-14 13:26:50

+0

那么你可能需要编写自己的函数。 – Sejanus 2010-03-14 13:28:42

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](http:// php。net/array_push),最好使用'$ tmp [] = $ row'而不是'array_push($ tmp,$ row)'。否则:很好的答案。 – middus 2010-03-14 15:23:30

+0

啊大声笑,你是对的,但现在我有一个疑问,为什么我应该使用array_push? :D ahah – Marcx 2010-03-14 18:04:09

相关问题