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

Jer*_*Roy 4 php csv

是否有更好(更快)的解决方案从逗号分隔的字符串中删除重复项?

public function d($dep) { 
    if (strpos($dep,',') !== false) {
        $nd = explode(',',$dep);
        $oa = array_unique($nd);
        $nx = (count($oa) > 1) ? implode(",",$oa) : $oa[0];
    }
    else {
        $nx = $dep;
    }

    return $nx;
}
Run Code Online (Sandbox Code Playgroud)

多谢你们.

Gum*_*mbo 21

您可以使用数组键的唯一性:

function d($dep) {
    return implode(',', array_keys(array_flip(explode(',', $dep))));
}
Run Code Online (Sandbox Code Playgroud)

array_flip交换键值关联,因此值成为键,反之亦然.这将自动消除重复.它的运行时复杂度为O(n).


eri*_*sco 13

试试吧:

$uniqueDep = implode(',', array_unique(explode(',', $dep)));
Run Code Online (Sandbox Code Playgroud)

  • @erisco:问题是是否有更好(更快)的解决方案.在谈论算法的速度时,您应该提到运行时的复杂性.因为这是抽象渐近运行时分析的*键.由于额外的排序,你的解决方案渐渐慢于我的解决方案. (3认同)

Pas*_*TIN 5

我可能会使用与您发布的相同的想法;但我认为你可以删除你的两个条件,只使用这个:

$exploded = explode(',', $str);
$unique = array_unique($exploded);
$imploded = implode(',', $unique);
var_dump($imploded);
Run Code Online (Sandbox Code Playgroud)

我已经用这三个字符串对其进行了测试,它似乎在每种情况下都有效:

$str = 'a,b,c,d,a,c,e,f';
$str = 'a,a';
$str = 'a';
Run Code Online (Sandbox Code Playgroud)


注意事项:

  • 使用explode不包含分隔符的字符串将返回一个包含一个元素的数组——不需要使用 strpos 进行测试。
  • 在只有一个元素的数组上使用implode也可以(不添加任何分隔符)——也不需要使用三元运算符进行测试。


当然,你也可以删除变量,只使用一行:

$result = implode(',', array_unique(explode(',', $str)));
Run Code Online (Sandbox Code Playgroud)

但不确定这样更容易理解……