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

7
我知道有array_unique函数,但我想要删除重复项。是否有内置函数,还是我必须自己编写?

示例输入:

banna, banna, mango, mango, apple

预期输出:

apple

你的输入和输出似乎是csv字符串。你的值总是分组在一起吗?还是可能顺序混合?从字面上看,根据你的示例数据,这将起作用:preg_replace('〜(\ b [^,]+),?(\ 1,?)+〜','',$ string); https://regex101.com/r/ChL2HI/1/ - mickmackusa
9个回答

13

3
多么奇异而简单的解决方案。 - Kendall Hopkins
1
请注意,尽管这可能是一个简洁的解决方案,但所有函数在内部都使用快速排序算法,在最坏情况下时间复杂度为O(n²)(平均情况下为O(n·log n))。因此,总的时间复杂度在最坏情况下也是O(n²)。 - Gumbo

6

您可以使用

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

请看


3
@Hannes 我不--这很优雅 :) 翻译: @Hannes,我不认为——这很优美 :) - jensgram

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期间以那种方式更改数组的大小,但它似乎有效。 - user229044
你为什么在 foreach 循环之前没有声明 $used = array() 呢? - Kendall Hopkins
1
@Kendall Hopkins 这并不是必须的,但你说得对,为了遵循良好的编码标准,我会添加它 :) - Hannes

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

1

如果你只想保留数组中已经唯一的值,而不是选择每个值的唯一实例,那么你确实需要自己编写代码。内置功能只是用来清理值集,而不是过滤。


1
你想要删除任何有重复的条目,这样你就只剩下列表中唯一的条目了? 嗯,听起来像是你需要自己编写代码实现。

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)之外的每个状态都是0。我从ID索引default数组,然后将其转换为字符串。因此,明确一点 - 如果返回的结果与多维数组的同一部分中的默认状态的ID相同且不是其键,则返回的结果是默认状态的ID。

0

上面的答案看起来很棒,但是顺便说一下:如果你想消除重复项但保留第一个,使用两次array_flip将是一种非常简单的方法。array_flip(array_flip(x))


真实的,但是双重翻转有基准证据表明它可以胜过array_unique...在StackOverflow上有一些讨论这个话题的页面。 - mickmackusa

-1

PHP.net http://php.net/manual/zh/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 不起作用。 - user229044
1
去除重复项,因此数组仅包含唯一的值。但是,OP希望删除任何重复值的所有实例,即仅保留仅出现一次的值。 - jensgram
我不明白你的意思。它应该可以工作。编辑:哦,就是那样。 - Thom Wiggers

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