2011-04-01 69 views
3

我有几个数组作为项目的数组,每个有5000到10000个值。in_array问题

全部都是简单的数组,像

$array = array(125,345345,345,3485,324,65,746647,3221, ...);

我试图寻找他们的一些号码,重复此操作近1 000倍液对不同的号码。

if $array has item 345 { 
    return true 
} else { 
    return false 
} 

,但该请求需要很长的时间才能完成。有时服务器会提供超时错误。

根据结构简单搜索某些数字的最佳方法是什么,但是通过它们的大小数组很大?

+0

请参阅http://stackoverflow.com/questions/1458242/alternatives-to-php-in-array-for-large-array-for-avoiding-duplicates-entries – 2011-04-01 16:27:46

回答

8

最简单的方法是翻转阵列(请参阅array_flip)并使用isset($array[$key])。它使用散列查找而不是搜索,因此速度更快。

除此之外,尝试使用数据库或一些更优化的方式处理大型数据集。

+0

似乎我可以添加一个数字作为关键和然后检查isset? – James 2011-04-01 16:31:30

+0

@罗,是的。我不确定你是如何构建阵列的。如果它是硬编码的,使用'array_flip'非常方便。 '$ a = array_flip(array(1,20,35,...))'。否则,如果您在运行时构建它,则可以执行'$ a [$ id] = true'。价值是无关紧要的。 – Matthew 2011-04-01 16:33:06

2
if (in_array(345, $array)) { 
    return true; 
} else { 
    return false; 
} 

没有看到你想要每1000次这样做。 使用数据库。

使用这样的DB:

$result = mysql_query("SELECT * WHERE number={$number}", $link); 
$x = (mysql_num_rows($result) > 0 ? mysql_num_rows($result) : false); 
+1

Simplified:'返回in_array(345,$ array);' – dgilland 2011-04-01 16:30:58

+0

对于1k个不同的数字,1k次 – James 2011-04-01 16:32:34

2

这比PHP的一个计算机科学的问题。我会建议寻找“二元搜索”或“二叉树”。如果你谷歌周围,你甚至可能会找到一个现有的实现。