我需要针对来自CSV文件(1000000+)的巨大(并且不断增长)字符串列表检查一些输入字符串。我目前在数组中加载每个字符串并通过in_array()检查它。代码如下所示:
$filter = array();
$filter = ReadFromCSV();
$input = array("foo","bar" /* more elements... */);
foreach($input as $i){
if(in_array($i,$filter)){
// do stuff
}
}
这已经需要一些时间了,我想知道有更快的方法吗?
答案 0 :(得分:3)
in_array()
检查数组中的每个元素,直到找到匹配项。平均复杂度为O(n)。
由于您要比较字符串,因此您可以将输入存储为数组键而不是值,并通过array_key_exists();
查找它们,这需要一个恒定的时间O (1)。
一些代码:
$filter = array();
$filter = ReadFromCSV();
$filter = array_flip($filter); // switch key <=> value
$input = array("foo","bar" /* more elements... */);
foreach($input as $i){
if(array_key_exists($i,$filter)){ // array_key_exists();
// do stuff
}
}
答案 1 :(得分:0)
这就是发明索引的目的。
这不是in_array()速度的问题,随着数据的增长,您应该考虑通过将数据加载到真实的DBMS中来使用索引。