从数组php中获取随机值的子集

时间:2010-08-17 15:53:55

标签: php arrays random

从具有10K值的数组开始。我想从中随机获取1000个值并将它们放入另一个数组中。

现在,我使用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 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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));