【问题标题】:Get a subset of random values from an array php从数组php中获取随机值的子集
【发布时间】:2010-08-17 15:53:55
【问题描述】:

从一个包含 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

【问题讨论】:

    标签: php arrays random


    【解决方案1】:

    嗯,有几个选择。我不确定哪个是最快的,因为您正在处理一个相当大的数组,但您可能想尝试一下:

    您可以使用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 路由。数组太大,会导致内存问题,循环只会选择几个重复的键。
    【解决方案2】:

    您可以使用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));
    

    【讨论】:

    • 谢谢汤姆,数组相交的工作方式与宣传的一样,但只有当我有一个较小的数组时,由于内存问题,大数组才会返回时髦的重复值/键(与我原来的循环方法相同的问题) .
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2022-10-08
    • 2023-02-25
    • 2011-09-22
    • 2012-07-11
    相关资源
    最近更新 更多