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

时间:2011-07-06 17:09:15

标签: php arrays

我正在比较两个逗号分隔的字符串并完全删除重复项。也就是说,如果两个字符串中都存在一个项目,那么它将不存在于结果中。

例如,比较cat,dog,alligatoralligator,parakeet的结果将是cat,dog,parakeet

我正在使用的解决方案涉及将字符串转换为数组进行比较。

$result = array_merge( array_diff($old, $new), array_diff($new, $old) );

上面的工作,但我想知道是否有更有效的方法(正则表达式,字符串比较)进行比较而不首先将字符串转换为数组。或者上述解决方案的性能是否真的没那么糟糕?

由于

4 个答案:

答案 0 :(得分:2)

阵列操作肯定会足够高效,除非你试图从百万项计算中挤出几秒钟。您的解决方案是最简单的,并且表现非常出色,因此是最好的。

答案 1 :(得分:1)

有趣的问题。可选地,有正则表达式可以完成工作。但在这种情况下,阵列要快得多。为了最小化函数调用,我会写这样的东西:

$str1 = "cat,dog,alligator";
$str2 = "alligator,parakeet";

$result = array_unique((array) explode(',', $str1 . ',' . $str2));

答案 2 :(得分:1)

您可以将其视为Set Math。在你的情况下,你希望联合减去交集(即对称差异)。

例如:

$result = array_diff(array_merge($s1, $s2), array_intersection($s1, $s2));

虽然你可以遍历每个项目并自己执行逻辑(例如来自 TheHorse 的答案),但最后,我相信PHP的本机数组函数将更具性能并提供更多功能灵活性(例如多套)。

话虽如此,您的解决方案仍然有效,并且是对称差异的PHP等效表示。那么为什么要改变它......

答案 3 :(得分:0)

对于大量元素的好解决方案是:

<?php
  $temp = sort(array_merge($old, $new)); /* n*log(n); */
  $res = array();
  for ($i = 0; $i < count($temp); $i++)
  {
     if ((count($res) == 0) || ($res[count($res) - 1] !== $temp[$i]))
       $res.append($temp[$i]);
  } 
?>

P.S。你可以优化它。