Php 将逗号分隔列表转换为数组-分解与预分割
我有以逗号分隔的城市名称列表。($cityNames可能包含100到500个名称) 考虑到性能和准确性,以下哪项更适合将逗号分隔的列表转换为数组Php 将逗号分隔列表转换为数组-分解与预分割,php,arrays,Php,Arrays,我有以逗号分隔的城市名称列表。($cityNames可能包含100到500个名称) 考虑到性能和准确性,以下哪项更适合将逗号分隔的列表转换为数组 $cityNamesArray = explode(",", $cityNames); 或 注意:-由用户使用textarea提供分隔列表。 提示:如果您不需要正则表达式的强大功能,您可以选择 更快(尽管更简单)的选择,如explode()或str_split() 关于准确性,在这两种情况下都会有问题,因为在给定的示例中,您将有以下数组: [1]
$cityNamesArray = explode(",", $cityNames);
或
注意:-由用户使用textarea提供分隔列表。
提示:如果您不需要正则表达式的强大功能,您可以选择
更快(尽管更简单)的选择,如explode()或str_split()
关于准确性,在这两种情况下都会有问题,因为在给定的示例中,您将有以下数组:
[1] => "Chicago"
[2] => " San Diego"
[3] => " El Paso"
(请注意[2]和[3]中的额外空格)
解决此问题的一种方法是替换所有出现的“、”to“、”等:
$cityNames = str_replace(', ', ',', $cityNames);
编辑:(失眠战胜了我)
只需确保在分隔符中包含空格:
$cityNamesArray = explode(", ", $cityNames);
提示:如果您不需要正则表达式的强大功能,您可以选择
更快(尽管更简单)的选择,如explode()或str_split()
关于准确性,在这两种情况下都会有问题,因为在给定的示例中,您将有以下数组:
[1] => "Chicago"
[2] => " San Diego"
[3] => " El Paso"
(请注意[2]和[3]中的额外空格)
解决此问题的一种方法是替换所有出现的“、”to“、”等:
$cityNames = str_replace(', ', ',', $cityNames);
编辑:(失眠战胜了我)
只需确保在分隔符中包含空格:
$cityNamesArray = explode(", ", $cityNames);
我总是想指出,解决方案的正确性总是优先于它的工作速度。不起作用但非常快的东西和起作用但非常慢的东西一样是个问题 因此,我将分别讨论解决方案的正确性及其效率 正确性 和的组合可以很好地实现您的预期目标
$cityNamesArray = array_map('trim', explode(',', $cityNames ));
您也可以在这里输入,以确保零长度字符串不会通过。因此,在类似于“芝加哥、圣地亚哥、埃尔帕索、纽约”的字符串中,
不会得到包含一些空值的数组
$cityNamesArray = array_filter(array_map('trim', explode(',', $cityNames )), 'strlen');
这假设数据可能不一致,并且中断会对期望的最终结果产生不利影响。因此,解决方案的正确性与此相关
这里的函数调用组合会导致数组迭代多次,因此您得到了O(n*2+k)
时间,其中k
是字符串中要查找定界的数字字符,n
是通过数组映射
和数组过滤器
的结果数组中的元素数
速度
现在想一想如何使它更快,我们需要将大O降到更接近O(k)
的位置,以获得最佳解决方案,因为您无法通过单字符指针/干草堆子字符串搜索进一步减少k
preg\u split('/\s*,\s*/',$cityNames,-1,preg\u split\u NO\u EMPTY)
方法的时间复杂度约为O(k)
因为它不太可能超过O(k+1)
或最坏情况O(k+log k)
如果PCRE VM中的过程超过一次
在上述情况下,它也能正常工作,$cityNames=“芝加哥、圣地亚哥、埃尔帕索、纽约,”
或类似结果
这意味着它同时满足正确性和效率的标准。因此,我认为这是最佳解决方案
基准点 话虽如此,我认为您会发现这两种方法之间的性能差异可以忽略不计 这里有一个基本的基准点来说明平均输入的差异是多么微不足道
$cityNames = "Chicago, San Diego,El Paso,,New York, ,"; // sample data
$T = 0; // total time spent
for($n = 0; $n < 10000; $n++) {
$t = microtime(true); // start time
preg_split('/\s*,\s*/', $cityNames, -1, PREG_SPLIT_NO_EMPTY);
$t = microtime(true) - $t; // end time
$T += $t; // aggregate time
}
printf("preg_split took %.06f seconds on average", $T / $n);
$T = 0; // total time spent
for($n = 0; $n < 10000; $n++) {
$t = microtime(true); // start time
array_filter(array_map('trim', explode(',', $cityNames )), 'strlen');
$t = microtime(true) - $t; // end time
$T += $t; // aggregate time
}
printf("array functions took %.06f seconds on average", $T / $n);
$cityNames=“芝加哥,圣地亚哥,埃尔帕索,纽约,”;//样本数据
$T=0;//花费的总时间
对于($n=0;$n<10000;$n++){
$t=微时间(真);//开始时间
预拆分('/\s*,\s*/',$cityNames,-1,预拆分否为空);
$t=微时间(真)-$t;//结束时间
$T+=$T;//聚合时间
}
printf(“preg_split平均耗时%.06f秒”,$T/$n);
$T=0;//花费的总时间
对于($n=0;$n<10000;$n++){
$t=微时间(真);//开始时间
数组过滤器(数组映射('trim','explode(',',$cityNames)),'strlen');
$t=微时间(真)-$t;//结束时间
$T+=$T;//聚合时间
}
printf(“数组函数平均花费%.06f秒”,$T/$n);
preg_split平均耗时0.000003秒
阵列函数平均耗时0.000005秒
这可能是它们之间的平均差1或2微秒。当测量这些微小的速度差异时,只要解决方案正确,你真的不应该太在意。解释性能问题的更好方法是按数量级进行度量。一个快1或2微秒的解决方案是不值得探索的,如果它比使用现有的解决方案花费更多的时间,而现有的解决方案几乎同样快,但同样正确。然而,一个解决方案可能会快1或2个数量级。我总是想尝试指出,解决方案的正确性总是优先于它的工作速度。不起作用但非常快的东西和起作用但非常慢的东西一样是个问题 因此,我将分别讨论解决方案的正确性及其效率 正确性 和的组合可以很好地实现您的预期目标
$cityNamesArray = array_map('trim', explode(',', $cityNames ));
您也可以在这里输入,以确保零长度字符串不会通过。因此,在类似于“芝加哥、圣地亚哥、埃尔帕索、纽约”的字符串中,
不会得到包含一些空值的数组
$cityNamesArray = array_filter(array_map('trim', explode(',', $cityNames )), 'strlen');
这假设数据可能不一致,并且中断会对期望的最终结果产生不利影响。因此,解决方案的正确性与此相关
functi的组合