在PHP中使用比in_array更快的方式来搜索数组中的内容吗?

时间:2014-08-31 11:53:17

标签: php arrays performance search

我需要针对来自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
  }
}

这已经需要一些时间了,我想知道有更快的方法吗?

2 个答案:

答案 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中来使用索引。