在PHP中删除字符串中的重复项

时间:2010-04-10 10:39:51

标签: php string duplicates

我正在寻找以逗号分隔的字符串中删除重复值的最快方法。

所以我的字符串看起来像这样;

$str = 'one,two,one,five,seven,bag,tea';

我可以将字符串爆炸到值然后进行比较,但我认为它会很慢。那么preg_replace()会更快吗?有人用这个函数做过吗?

2 个答案:

答案 0 :(得分:119)

最短的代码是:

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

如果它是最快的...我不知道,它可能比明确循环更快。

参考:implodearray_uniqueexplode

答案 1 :(得分:0)

处理:$string = 'one,two,one,five,seven,bag,tea';

如果你在“up script”的任何一点生成字符串,那么你应该在它们发生时消除重复。

假设您正在使用连接来生成字符串,如:

$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').some_func($value);
}

...然后你需要根据分隔符(逗号)从$string中提取唯一值,然后使用分隔符重新崩溃。

我建议您设计一个更直接的方法并在初始foreach循环中拒绝重复,如下所示:

foreach($data as $value){
    $return_value=some_func($value);  // cache the returned value so you don't call the function twice
    $array[$return_value]=$return_value;  // store the return value in a temporary array using the function's return value as both the key and value in the array.
}
$string=implode(',',$array);  // clean: no duplicates, no trailing commas

这是有效的,因为永远不允许存在重复值。所有后续出现都将用于覆盖先前发生的事件。这个无功能的过滤器可以工作,因为数组在同一个数组(级别)中可能没有两个相同的键。

或者,您可以通过调用if(!isset($array[$return_value])){$array[$return_value]=$return_value;}来避免在循环中“覆盖”数组数据,但差异意味着在每次迭代时调用isset()函数。使用这些关联键分配的优点是该过程避免使用比in_array()慢的isset()

所有这一切,如果你从二维数组中提取一列数据,如:

$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').$value['word'];
}

然后你可以利用array_column()的魔力,而无需循环like this

echo implode(',',array_column($str,'word','word'));

最后,对于那些对微优化感兴趣的人,我会注意到array_unique()的单个调用实际上比几个双函数方法慢。 Read here了解更多详情。

最重要的是,有很多方法可以执行此任务。如果您没有生成分隔字符串,explode->unique->implode在某些情况下可能是最简洁的方法,但它不可能是最直接或最快的方法。为自己选择最适合您的任务。