2010-10-14 87 views

回答

12

您可以使用array_uniquearray_diff_assocarray_diff组合:

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

什么是一个奇怪的简单的解决方案。 – 2010-10-14 14:00:03

+1

请注意,虽然这可能是一个简明的解决方案,但在最坏的情况下(O(n·log n)平均情况下),所有函数都在内部使用Quicksort,它在O(n²)中。所以在最坏的情况下,总的复杂度在O(n 2)中。 – Gumbo 2010-10-15 06:02:46

4

可以使用

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

参见

的密钥的子集 - 用回调函数
  • array_keys滤光器阵列的元件
  • +0

    现在,这是有道理的,但我仍然喜欢我的更多^^ – Hannes 2010-10-14 13:52:25

    +2

    @Hannes我不 - 这是优雅的:) – jensgram 2010-10-14 13:54:25

    -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; 
         } 
    } 
    
    +1

    -1阅读问题中的例子; 'array_unique'不起作用。 – meagar 2010-10-14 13:47:11

    +1

    删除重复项,从而使数组仅包含唯一值。然而,OP要求移除任何重复值的所有*实例,即仅保留仅表示一次*的值。 – jensgram 2010-10-14 13:48:59

    +0

    我不明白你的意思。它应该工作。编辑:哦,那样。 – 2010-10-14 13:49:16

    1

    如果你想只留下那些已经独一无二的,而不是选择每个价值的唯一实例数组中的值,你的确要滚你自己。内置的功能只是为了清理值集,而不是过滤。

    1

    您想删除所有具有重复项的条目,以便只留下列表中唯一的条目吗?嗯,它听起来像你需要推出自己的东西。

    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; 
    } 
    
    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" } 
    

    生活的乐趣: )

    +1

    出于某种原因,我不认为你可以在'foreach'期间改变数组的大小,但它似乎工作。 – meagar 2010-10-14 13:54:21

    +0

    是否有任何理由在foreach循环之前没有声明'$ used = array()'? – 2010-10-14 14:02:26

    +1

    @肯代尔霍普金斯这是没有必要的,但你是正确的良好编码标准的精神,我会添加它:) – Hannes 2010-10-14 14:05:11

    0

    上面的答案看起来不错,但是一个方面说明:如果您想要消除重复但保留第一个,使用array_flip两次将是一个非常简单的方法。array_flip(array_flip(X))

    +0

    你有'array_unique' – 2010-10-23 15:23:04

    0

    只有部分相关与这个特定的问题 - 但是我创造了从甘博的回答对多维数组这样的功能:

    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,它提供了在多维数组的相同部分,而不是它的关键