如何从数组中删除重复值的所有实例

时间:2010-10-14 13:41:44

标签: php arrays

我知道有array_unique函数,但我想删除重复项。是否有内置功能或者我必须自己动手。

示例输入:

banna, banna, mango, mango, apple

预期产出:

apple

9 个答案:

答案 0 :(得分:13)

您可以结合使用array_uniquearray_diff_assocarray_diff

array_diff($arr, array_diff_assoc($arr, array_unique($arr)))

答案 1 :(得分:6)

您可以使用

$singleOccurences = array_keys(
    array_filter(
        array_count_values(
            array('banana', 'mango', 'banana', 'mango', 'apple' )
        ),
        function($val) {
            return $val === 1;
        }
    )
)

答案 2 :(得分:2)

只需编写自己的简单foreach循环:

$used = array();    
$array = array("banna","banna","mango","mango","apple");

foreach($array as $arrayKey => $arrayValue){
    if(isset($used[$arrayValue])){
        unset($array[$used[$arrayValue]]);
        unset($array[$arrayKey]);
    }
    $used[$arrayValue] = $arrayKey;
}
var_dump($array); // array(1) { [4]=>  string(5) "apple" } 

玩得开心:)

答案 3 :(得分:1)

如果您只想在数组中保留已经唯一的值,而不是选择每个值的一个唯一实例,那么您确实必须自己滚动。内置功能就是清理值集,而不是过滤。

答案 4 :(得分:1)

您想要删除任何具有重复项的条目,这样您只剩下列表中唯一的条目吗? 嗯,这听起来像是你需要自己动手的东西。

答案 5 :(得分:1)

没有现有的功能;您必须在两个过程中执行此操作,一个用于计算唯一值,另一个用于提取唯一值:

$count = array();
foreach ($values as $value) {
  if (array_key_exists($value, $count))
    ++$count[$value];
  else
    $count[$value] = 1;
}

$unique = array();
foreach ($count as $value => $count) {
  if ($count == 1)
    $unique[] = $value;
}

答案 6 :(得分:0)

顶部的答案看起来很棒,但是旁注:如果你想要消除重复但是留下第一个,使用array_flip两次将是一个非常简单的方法。 array_flip(array_flip(X))

答案 7 :(得分:0)

仅与此特定问题部分相关 - 但我从Gumbo的多维数组答案中创建了此函数:

function get_default($array)
{
    $default = array_column($array, 'default', 'id');
    $array = array_diff($default, array_diff_assoc($default, array_unique($default)));

    return key($array);
}

在这个例子中,我有缓存状态,除了默认值之外的每一个都是0(默认值是1)。我从ID索引default数组,然后将其转换为字符串。所以要清楚 - 返回的结果是默认状态的ID,它提供了它在多维数组的同一部分而不是它的关键

答案 8 :(得分:-1)

PHP.net http://php.net/manual/en/function.array-unique.php

  

array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

     

获取输入数组并返回没有重复值的新数组。


新解决方案:


function remove_dupes(array $array){
    $ret_array = array();
    foreach($array as $key => $val){
        if(count(array_keys($val) > 1){
            continue;
        } else { 
            $ret_array[$key] = $val; 
        }
}