我有一个用逗号分隔的名字列表(它们可能包含其他字符),或者是空的,但通常看起来像这样:
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);
答案 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);