【问题标题】:php getting unique values of a multidimensional array [duplicate]php获取多维数组的唯一值[重复]
【发布时间】:2010-03-14 13:14:26
【问题描述】:

可能重复:
php multi-dimensional array remove duplicate

我有一个这样的数组:

$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,但我认为这不起作用,因为这个数组是多维的。

编辑:我还需要这个数组是多维的,并且在这种格式下,我不能展平它。

【问题讨论】:

  • 讽刺的是,有几个重复:stackoverflow.com/search?q=php+array+duplicate
  • 它们完全不同?告诉我哪个回答了多维数组的问题。
  • 有很多,一些用于多维数组,一些用于单维数组。我特别投票结束的问题是:stackoverflow.com/questions/1861682/…,这几乎是同一个问题(根据子元素值删除元素)。请不要把它当作个人。如果没有数百个重复的问题,它更适合 SO。

标签: php arrays


【解决方案1】:

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)));

【讨论】:

  • 这就是为什么您需要 SORT_REGULAR 标志,以防止数组转换为字符串。理论上,至少。
  • @Sejanus:我也是这么想的。但它似乎对马克不起作用。所以我提出了一个替代方案。
  • 我喜欢这样简单的解决方案,我认为我将不得不做很多循环来解决这个问题。谢谢!
  • 最后一个解决方案帮助我喜欢魅力...谢谢
  • 这个很好,找了一会儿
【解决方案2】:

这里:)

<?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);
?>

【讨论】:

  • 根据php.net,最好使用$tmp[] = $row而不是array_push($tmp, $row)。否则:很好的答案。
  • 啊大声笑,你是对的,但现在我怀疑,我为什么要使用 array_push? :D啊
  • array_push() 如果您想一次将多个元素推送到数组中,或者如果您想使用函数提供的返回值(数组计数),这很有用。否则,我也推荐[]。循环中的in_array() 通常是个坏主意。
【解决方案3】:

使用 SORT_REGULAR 标志。

$unique_array = array_unique($a, SORT_REGULAR);

我不知道为什么它会有所帮助,但确实如此。至少使用 php 5.3

【讨论】:

  • 来自 php 文档:Note: Note that array_unique() is not intended to work on multi dimensional arrays.
  • 哦,我用的是 5.2,它不适合我。
  • 在这种情况下,您可能需要编写自己的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2023-03-03
  • 1970-01-01
  • 2012-05-03
  • 2013-10-04
相关资源
最近更新 更多