2011-04-01 88 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的一個計算機科學的問題。我會建議尋找「二元搜索」或「二叉樹」。如果你谷歌周圍,你甚至可能會找到一個現有的實現。