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
vs0
“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