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

时间:2010-08-02 11:54:13

标签: php arrays string

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

NameA,NameB,NameC

我需要创建一个函数来删除名称,如果它存在于列表中并恢复逗号分隔结构。

例如:如果要删除NameA,我最终应该:

NameB,NameC

不是

,NameB,NameC

其他类似。

这就是我提出的,有更好的解决方案吗?

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

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

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

4 个答案:

答案 0 :(得分:2)

这应该很好用。您可能还对PHP的fgetcsv函数感兴趣 Doc:http://php.net/manual/en/function.fgetcsv.php

答案 1 :(得分:1)

您可以使用array_splice函数从数组中删除。使用offset = array_search($ deleteuser,$ pieces)和length = 1。

答案 2 :(得分:0)

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

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

  • explode() + array_search() + unset() + implode()demo
    系统时间:〜.009-.011s < / p>

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

  • explode() + array_search() + array_splice() + implode()demo
    系统时间:〜.010-.012s < / p>

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

  • explode() + foreach() + if() + unset() + break + implode()demo
    系统时间:〜.011-.012s

    $pieces = explode(",", $list);
    foreach ($pieces as $key => $value) {
        if ($value == $deleteuser) {
            unset($pieces[$key]);
            break;
        }
    }
    echo implode(",", $pieces);
    

    (注意:如果您移除break,则循环可以移除多次出现的针)


  • explode() + array_diff() + implode()demo
    系统时间:〜.010-.011s

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

  • explode() + array_filter() + implode()demo
    系统时间:〜.010-.013s

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

  • preg_quote() + preg_replace()demo)(regex demo
    系统时间:〜.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
    

因此,尽管对于我随意设定的字符串长度而言,基于正则表达式的代码片段稍快(明显),但您仍需要制定自己的基准测试,以确保哪一个是最适合您的应用程序的表现。

话虽如此,但不要误会我喜欢正则表达式,但是当需要修改模式时,正则表达式将是开发人员最容易“弄错”的表达式,而且我相信大多数开发人员都会同意它的整体可理解性最差。

答案 3 :(得分:-1)

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

$search = 'NameB';
$list = 'NameA,NameB,NameC';
$list = preg_match('/(^' . $search . ',)|(,' . $search. ')/', '', $list);