从逗号分隔的字符串中删除重复项

时间:2011-02-27 15:58:43

标签: php csv

是否有更好(更快)的解决方案从逗号分隔的字符串中删除重复项?

public function d($dep) { 
    if (strpos($dep,',') !== false) {
        $nd = explode(',',$dep);
        $oa = array_unique($nd);
        $nx = (count($oa) > 1) ? implode(",",$oa) : $oa[0];
    }
    else {
        $nx = $dep;
    }

    return $nx;
}

谢谢你们。

5 个答案:

答案 0 :(得分:21)

您可以使用数组键的唯一性:

function d($dep) {
    return implode(',', array_keys(array_flip(explode(',', $dep))));
}

array_flip交换键值关联,因此值成为键,反之亦然。这将自动消除重复。它的运行时复杂度为O( n )。

答案 1 :(得分:13)

试试这个:

$uniqueDep = implode(',', array_unique(explode(',', $dep)));

答案 2 :(得分:4)

我可能会使用与您发布的内容相同的想法;但我认为你可以删除你的两个条件,只使用它:

$exploded = explode(',', $str);
$unique = array_unique($exploded);
$imploded = implode(',', $unique);
var_dump($imploded);

我用这三个字符串对它进行了测试,它似乎适用于每种情况:

$str = 'a,b,c,d,a,c,e,f';
$str = 'a,a';
$str = 'a';


注意:

  • 在不包含分隔符的字符串上使用explode将返回一个包含一个元素的数组 - 不需要使用strpos进行测试。
  • 在只有一个元素的数组上使用implode也会起作用(不添加任何分隔符) - 你也不需要使用三元运算符进行测试。


当然,您也可以删除变量,并且只使用一行:

$result = implode(',', array_unique(explode(',', $str)));

不确定这种方式更容易理解,但是......

答案 3 :(得分:2)

很多人都感谢你们。最后,我们在这里有两个解决方案(Pascal和Ericso给出了相同的解决方案),问题变成哪一个更快。说实话,通过更快,我的意思是执行得更快,如果我接受Gumbo的话,我会得到array_keysarray_flip的组合函数比array_unique更快。因为,implodeexplode这两个函数是相同的。

return implode(',', array_unique(explode(',', $dep)));
return implode(',', array_keys(array_flip(explode(',', $dep))));

最后,由于无法衡量/看到,我给了所有三个广告的1个。我同意这三种解决方案中的任何一种都是可以预期的,但后来我认为Gumbo的答案是array_keys(array_flip())在给定的上下文中执行速度比array_unique()更快。

干杯。

答案 4 :(得分:0)

$str = implode(',',array_unique(explode(',', $str)));