是否有更好(更快)的解决方案从逗号分隔的字符串中删除重复项?
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;
}
谢谢你们。
答案 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_keys
和array_flip
的组合函数比array_unique
更快。因为,implode
和explode
这两个函数是相同的。
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)));