我正在比较两个逗号分隔的字符串并完全删除重复项。也就是说,如果两个字符串中都存在一个项目,那么它将不存在于结果中。
例如,比较cat,dog,alligator
和alligator,parakeet
的结果将是cat,dog,parakeet
。
我正在使用的解决方案涉及将字符串转换为数组进行比较。
$result = array_merge( array_diff($old, $new), array_diff($new, $old) );
上面的工作,但我想知道是否有更有效的方法(正则表达式,字符串比较)进行比较而不首先将字符串转换为数组。或者上述解决方案的性能是否真的没那么糟糕?
由于
答案 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。你可以优化它。