从 PHP 中的字符串中删除重复项
我正在寻找最快的方法来删除以逗号分隔的字符串中的重复值。
所以我的绳子看起来像这样;
$str = 'one,two,one,five,seven,bag,tea';
我可以将字符串分解为值,然后进行比较,但我认为它会很慢。preg_replace()会更快吗?有人使用此功能做过吗?
我正在寻找最快的方法来删除以逗号分隔的字符串中的重复值。
所以我的绳子看起来像这样;
$str = 'one,two,one,five,seven,bag,tea';
我可以将字符串分解为值,然后进行比较,但我认为它会很慢。preg_replace()会更快吗?有人使用此功能做过吗?
最短的代码是:
$str = implode(',',array_unique(explode(',', $str)));
如果它是最快的...我不知道,它可能比显式循环更快。
参考:内爆
、array_unique
、爆炸
处理:$string = 'one,two,one,five,seven,bag,tea';
如果您在任何时候生成字符串“up脚本”,那么您应该在重复发生时消除它们。
假设您正在使用串联来生成字符串,例如:
$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
这是有效的,因为永远不允许存在重复值。所有后续事件都将用于覆盖较早的事件。这种无函数过滤器之所以有效,是因为数组在同一数组(level)中可能没有两个相同的键。
或者,您可以通过调用来避免循环中的数组数据“覆盖”,但差异意味着在每次迭代时调用函数。使用这些关联键赋值的优点是,该过程避免使用比 慢的键赋值。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()
echo implode(',',array_column($str,'word','word'));
最后,对于那些对微优化感兴趣的人来说,我会注意到,单个调用实际上比几个双函数方法慢。有关更多详细信息,请阅读此处。array_unique()
最重要的是,有很多方法可以执行此任务。 如果您不生成分隔字符串,则在某些情况下可能是最简洁的方法,但它不太可能是最直接或最快的方法。自己选择最适合您的任务。explode->unique->implode