我知道如何从数组中选择一个随机项目,但是从一个数组中(比如说,20个)随机选择10个项目怎么样?(用PHP.)
使它更加复杂的是,每个项目实际上有两个部分:一个文件名和一个描述。基本上,它是为一个网页,将显示10个随机图像,每次你重新加载。这些数据的实际格式并不重要,尽管它非常简单,我更愿意用纯文本甚至硬代码来包含它,而不是建立一个数据库。(这也不意味着要经常改变。)
发布于 2009-08-07 12:16:22
可以使用array_rand()函数从数组中选择一个或多个随机项。
发布于 2009-08-07 12:27:55
可以对数组进行shuffle,然后使用array_slice选择前十个元素。
shuffle($array);
$tenRandomElements = array_slice($array, 0, 10);发布于 2022-07-13 23:34:18
如果您不想shuffle()整个数组(可能是因为您的数组相对较大),您可以调用array_rand()来填充键数组,然后使用该键数组过滤输入数组。
代码:(演示)
$input = [
['filename' => 'a.php', 'description' => 'foo'],
['filename' => 'b.php', 'description' => 'fooey'],
['filename' => 'c.php', 'description' => 'bar'],
['filename' => 'd.php', 'description' => 'berry'],
['filename' => 'e.php', 'description' => 'buoy'],
['filename' => 'f.php', 'description' => 'barf'],
['filename' => 'g.php', 'description' => 'food'],
['filename' => 'h.php', 'description' => 'foodie'],
['filename' => 'i.php', 'description' => 'boof'],
['filename' => 'j.php', 'description' => 'boogey'],
['filename' => 'k.php', 'description' => 'fudge'],
['filename' => 'l.php', 'description' => 'fudgey'],
['filename' => 'm.php', 'description' => 'barge'],
['filename' => 'n.php', 'description' => 'buggy'],
['filename' => 'o.php', 'description' => 'booger'],
['filename' => 'p.php', 'description' => 'foobar'],
['filename' => 'q.php', 'description' => 'fubar'],
['filename' => 'r.php', 'description' => 'goof'],
['filename' => 's.php', 'description' => 'goofey'],
['filename' => 't.php', 'description' => 'boofey'],
];
var_export(
array_intersect_key(
$input,
array_flip(
array_rand($input, 10)
)
)
);您会注意到,输出中只有10行随机选择的数据。
与shuffle()不同,因为$input是在array_intersect_key()中首先被提名的,所以“随机”项目实际上是按照它们原来的顺序排列的。
即使使用经典循环迭代array_rand()的返回数组,结果仍将根据它们在原始数组中的位置进行排序。
代码:(演示)
$randoms = [];
foreach (array_rand($input, 10) as $key) {
$randoms[] = $input[$key];
}
var_export($randoms);如果随机元素的位置很重要,则应该对随机选择的结果调用shuffle()。
请注意,PHP手册为array_rand()提供了以下内容
如果您不确定将选择多少个随机项或数组中有多少项,请使用min($yourNumberOfRandomItemsToReturn, count($yourArray))。
https://stackoverflow.com/questions/1244399
复制相似问题