Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将逗号分隔列表转换为数组-分解与预分割_Php_Arrays - Fatal编程技术网

Php 将逗号分隔列表转换为数组-分解与预分割

Php 将逗号分隔列表转换为数组-分解与预分割,php,arrays,Php,Arrays,我有以逗号分隔的城市名称列表。($cityNames可能包含100到500个名称) 考虑到性能和准确性,以下哪项更适合将逗号分隔的列表转换为数组 $cityNamesArray = explode(",", $cityNames); 或 注意:-由用户使用textarea提供分隔列表。 提示:如果您不需要正则表达式的强大功能,您可以选择 更快(尽管更简单)的选择,如explode()或str_split() 关于准确性,在这两种情况下都会有问题,因为在给定的示例中,您将有以下数组: [1]

我有以逗号分隔的城市名称列表。($cityNames可能包含100到500个名称)

考虑到性能和准确性,以下哪项更适合将逗号分隔的列表转换为数组

$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的组合