【问题标题】:remove duplicate from string in PHP从 PHP 中的字符串中删除重复项
【发布时间】:2011-02-06 11:17:09
【问题描述】:

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

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

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

我可以将字符串分解为值然后进行比较,但我认为它会很慢。 preg_replace() 会更快吗?有人用过这个功能吗?

【问题讨论】:

  • 这个数据的估计大小是多少?

标签: php string duplicates


【解决方案1】:

最短的代码是:

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

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

参考:implode、array_unique、explode

【讨论】:

  • 谢谢@Felix,太好了,这正是我所需要的,字符串中的最大值是 50。
  • @Adnan:有 50 个值,这应该不是什么大问题 :)
  • 如果是 2 的倍数则有效。如果不是,则失败。
  • @DanielOmine:不知道你到底是什么意思。数组中有多少元素并不重要。
  • @DanielOmine: “但也删除了重复的文件夹名称” 很好,但这正是这个问题所要问的。所以,是的,这不是您的用例的解决方案。如果你想折叠连续的/,你可以做preg_replace('#//+#', '/', $str)。
【解决方案2】:

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

如果您在“向上脚本”的任何时候生成字符串,那么您应该在重复出现时消除它们。

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

$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() 函数。使用这些关联键分配的优点是该过程避免使用比isset() 慢的in_array()。

综上所述,如果您要从二维数组中提取一列数据,例如:

$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 在某些情况下可能是最简洁的方法,但它可能不是最直接或最快的方法。为您自己选择最适合您的任务的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2014-04-03
    • 1970-01-01
    • 2020-05-31
    • 2014-07-23
    • 2017-06-20
    相关资源
    最近更新 更多