【问题标题】:Is there a faster way to search something in an array than in_array in PHP?有没有比 PHP 中的 in_array 更快的方法来搜索数组中的内容?
【发布时间】:2014-10-24 20:22:29
【问题描述】:

我需要根据来自 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
  }
}

这已经花费了一些时间,我想知道是否有更快的方法来做到这一点?

【问题讨论】:

  • 也许您应该考虑使用数据库,而不是每次都将值从 CSV 读取到内存中。

标签: php arrays performance search


【解决方案1】:

in_array() 检查数组中的每个元素,直到找到匹配项。平均复杂度为 O(n)。

由于您正在比较字符串,您可以将输入存储为数组 keys 而不是 values 并通过 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
  }
}

【讨论】:

  • 哇.. 这真的很重要。为什么 in_array 不能那么快?
  • 它只适用于easy,因为您正在比较字符串。数组键类型仅限于integerstring,而数组值可以是任何值。
【解决方案2】:

这就是发明索引的目的。

这不是 in_array() 速度的问题,随着数据的增长,您可能应该考虑通过将数据加载到真正的 DBMS 中来使用索引。

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 2014-09-23
    • 2019-10-09
    • 2014-07-22
    • 2023-03-23
    • 2016-01-30
    • 2012-10-28
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多