那麼,有幾個選擇。我不確定哪個是你處理一個相當大的陣列以來最快的,但你可能想試試看:
你可以使用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;
謝謝maxell,我可能不得不使用sql路由。數組大小太大,會導致內存問題,並且循環只能選擇幾個重複鍵。 – jamex 2010-08-18 06:39:16