从具有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
答案 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));