2010-08-17 113 views
2

從具有10K值的數組開始。我想從它中隨機獲取1000個值並將它們放入另一個數組中。從數組中獲取隨機值的子集php

現在,我正在使用for循環來獲取值,但我想選取1000個值並且不必循環1000次。 array_slice函數可以工作,但不會給出隨機值。什麼是這個任務的正確(最有效的)功能。

代碼現在的問題是

$seedkeys = (...array.....); 

for ($i=0; $i<1000; $i++) { 
     $random = array_rand($seedkeys); 
    $randseed[$i] = $seedkeys[$random]; 

}//for close 

TIA

回答

2

那麼,有幾個選擇。我不確定哪個是你處理一個相當大的陣列以來最快的,但你可能想試試看:

你可以使用shuffle,它會隨機化整個陣列。由於您正在消耗陣列的很大一部分(10%),因此這可能會具有最佳性能。

shuffle($seedkeys); 
$result = array_slice($seedkeys, 0, 1000); 

您可以在Tom Haigh指定的莊園中使用array_rand(如您所說)。這將需要複製密鑰,所以如果你處理源數組的很大一部分,這可能不是最快的。 (注意使用的array_flip,它需要允許的array_intersect_key用法:

$keys = array_flip(array_rand($seedkeys, 1000)); 
$result = array_intersect_key($seedkeys, $keys); 

如果內存資源緊張,最好的解決辦法(除了MySQL的一個)將是一個循環,因爲它不需要數組爲但是如果數組包含大量信息,它可以通過提高內存效率來抵消緩慢(因爲它只是複製它返回的內容)...

$result = array(); 
for ($i = 0; $i < 1000; $i++) { 
    $result[] = $seedkeys[array_rand($seedkeys)]; 
} 

你可以在MySQL中做到這一點(假設數組的數據從MySQL開始)。請注意,這很簡單,但效率不高(參見Jan Kneschke's post)...

SELECT * FROM `foo` ORDER BY RAND() LIMIT 1000; 
+0

謝謝maxell,我可能不得不使用sql路由。數組大小太大,會導致內存問題,並且循環只能選擇幾個重複鍵。 – jamex 2010-08-18 06:39:16

0

你可以使用array_rand()獲得多個項目?

$random_keys = array_rand($seedkeys, 1000); 
shuffle($random_keys); 

這會給你一個隨機的按鍵陣列,這樣得到的值的數組,你需要做這樣的事情:

$result = array(); 
foreach ($random_keys as $rand_key) { 
    $result[] = $seedkeys[$rand_key]; 
} 

你也可以使用array_intersect_key()

$result = array_intersect_key($seedkeys, array_flip($random_keys)); 
+0

由於湯姆,陣列相交作品像廣告,但只有當我有一個較小的陣列,所述大陣列由於存儲器問題(同樣的問題時髦重複值/返回鍵我的原始循環方法)。 – jamex 2010-08-18 06:41:25