Php 删除逗号分隔列表中的值的最快方法

Php 删除逗号分隔列表中的值的最快方法,php,arrays,string,Php,Arrays,String,我有一个用逗号分隔的名称列表(它们可能包含其他字符),或者是空的,但通常看起来像这样: NameA,NameB,NameC 我需要创建一个函数来删除列表中存在的名称,并恢复逗号分隔的结构 例如:如果要删除NameA,我最终会得到: NameB,NameC 不是 其他人也一样 这就是我想到的,有更好的解决方案吗 $pieces = explode(",", $list); $key=array_search($deleteuser, $pieces);

我有一个用逗号分隔的名称列表(它们可能包含其他字符),或者是空的,但通常看起来像这样:

NameA,NameB,NameC
我需要创建一个函数来删除列表中存在的名称,并恢复逗号分隔的结构

例如:如果要删除NameA,我最终会得到:

NameB,NameC
不是

其他人也一样

这就是我想到的,有更好的解决方案吗

        $pieces = explode(",", $list);

        $key=array_search($deleteuser, $pieces);
        if(FALSE !== $key)
        {
            unset($pieces[$key]);
        }

        $list = implode(",", $pieces);

您可以使用该函数从数组中删除。使用offset=array\u search($deleteuser,$pieces)和length=1。

这应该可以很好地工作。您可能还对PHP的fgetcsv函数感兴趣。

Doc:

您也可以尝试这样的正则表达式(也许可以对其进行优化):


如果您的应用程序数据太大,以致于您遇到了严重的延迟,那么您可能会遇到比这段代码更大的问题。现在可能是重新考虑数据存储和处理的时候了

同时,这里有一些基准测试,当使用逗号内插5001元素数组,然后使用不同的技术删除值
4999
。(速度实际上包括逗号分隔字符串的生成,但所有基准在这方面都是相同的)

  • explode()

    $pieces = explode(",", $list);
    if (($key = array_search($deleteuser, $pieces)) !== false) {
        unset($pieces[$key]);
    }
    echo implode(",", $pieces);
    

  • explode()
    +
    array\u search()
    +
    array\u splice()
    +
    内爆()
    ()
    系统时间:~.010-.012s

    $pieces = explode(",", $list);
    if (($key = array_search($deleteuser, $pieces)) !== false) {
        array_splice($pieces, $key, 1);
    }
    echo implode(",", $pieces);
    

  • explode()

    $pieces = explode(",", $list);
    foreach ($pieces as $key => $value) {
        if ($value == $deleteuser) {
            unset($pieces[$key]);
            break;
        }
    }
    echo implode(",", $pieces);
    
    (注意:如果删除
    断开
    ,循环可以删除多次出现的指针)


  • explode()
    +
    array_diff()
    +
    内爆()
    ()
    系统时间:~.010-.011s

    $pieces = explode(",", $list);
    $pieces = array_diff($pieces, [$deleteuser]);
    echo implode(",", $pieces);
    // or just: echo implode(',', array_diff(explode(",", $list), [$deleteuser]);
    

  • explode()
    +
    array\u filter()
    +
    内爆()
    ()
    系统时间:~.010-.013s

    $pieces = explode(",", $list);
    $pieces = array_filter($pieces, function($v) use ($deleteuser) {
        return $v != $deleteuser;
    });
    echo implode(",", $pieces);
    

  • preg_quote()
    +
    preg_replace()
    ()
    系统时间:~.007-.010s

    $needle = preg_quote($deleteuser, '/');
    echo preg_replace('/,' . $needle . '(?=,|$)|^' . $needle . ',/', '', $list);
    // if replacing only one value, declare preg_replace's 4th parameter as 1
    
因此,尽管基于正则表达式的代码片段被证明比我任意变出的字符串长度快一些(不明显),但您需要制定自己的基准,以确保哪一个是应用程序的最佳执行者


也就是说,不要误会我喜欢正则表达式,但是正则表达式对于开发人员来说是最容易“出错”的,因为到了修改模式的时候了,我相信大多数开发人员都会认为它的整体可理解性最差。

为什么需要“最快”的方法?有什么特别的原因吗?没有,没什么特别的,但是explode/array\u search/introde方法看起来很慢……这些方法很慢,因为它们是数组操作。字符串操作似乎更快。有关不使用数组操作的方法,请参见下面的答案。
array\u splice()
为什么比使用
unset()
更快?看起来您还没有注意到
false
vs
0
“gotcha”。
$pieces = explode(",", $list);
$pieces = array_filter($pieces, function($v) use ($deleteuser) {
    return $v != $deleteuser;
});
echo implode(",", $pieces);
$needle = preg_quote($deleteuser, '/');
echo preg_replace('/,' . $needle . '(?=,|$)|^' . $needle . ',/', '', $list);
// if replacing only one value, declare preg_replace's 4th parameter as 1