我知道如何从数组中选择一个随机项,但是如何从一个数组(例如二十个项目)中随机选择十个? (在PHP中。)
更复杂的是每个项目实际上有两个部分:文件名和描述。基本上,它是一个网页,每次重新加载时将显示十个随机图像。这些数据的实际格式并不重要,尽管它很简单,我宁愿将其包含在平面文本中,甚至是硬编码,而不是设置数据库。 (这也不是经常改变的。)
奖金问题,不确定我是否会这样做 - 但你会如何权衡这些条目,以至于某些项始终被选中,或者至少比其他项更频繁?
感谢。
答案 0 :(得分:21)
您可以shuffle
数组,然后使用array_slice
选择前十个元素:
shuffle($array);
$tenRandomElements = array_slice($array, 0, 10);
答案 1 :(得分:16)
如何从php中的数组中选择一个或多个随机项:http://us3.php.net/manual/en/function.array-rand.php
如何做随机加权元素:
http://20bits.com/articles/random-weighted-elements-in-php/
答案 2 :(得分:3)
示例#1 array_rand()示例
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>
答案 3 :(得分:0)
<?php
$inarray = range(0,100);
shuffle($inarray);
$outarray = array_slice($inarray, 0, 20);
?>
答案 4 :(得分:0)
PHP中的数组数组应该是一个很好的策略。您可以以任何您喜欢的方式(硬编码,XML等)保存这些数组的数据,并将其排列在数组中:
Array {
Array (item0) { filename,description, weight,...}
Array (item1) { filename,description, weight,...}
Array (item2) { filename,description, weight,...}
}
然后,您可以使用array_rand函数从数组中随机删除项目。为每个条目创建一个权重值将允许您使用某种优先级策略选择一个条目而不是另一个条目(例如,从数组中随机获取2个项目,检查权重,选择权重更大的项目并替换另一个项目)
答案 5 :(得分:0)
奖金问题答案: 看看Roulette Wheel selection。该网站谈论遗传算法,但选择方法是合理的,可以应用于一系列的想法。
答案 6 :(得分:0)
我有一些代码可以满足您的要求。我在文本文件中存储赞助商链接列表,并随机选择它们。但是,如果我想扭曲该集合,我会使用多个链接;-)
赞助商档案:
<a href="http://www.example.com">Example</a>
<a href="http://www.example.com">Example</a>
<a href="http://www.bbc.co.uk">BBC</a>
<a href="http://www.google.com">Google</a>
PHP:
$sponsor_config = 'sponsors.txt';
$trimmed = file($sponsor_config, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$op = array();
$limit = 20; // insurance
$loops = 0;
$needed = 4;
$op[] = '<div id="sponsorship"><!-- start sponsorship -->';
$selected = array();
while ( (count($selected) < $needed) AND ($loops <= $limit)) {
$choice = rand(0, count($sponsors)-1);
if(!in_array($sponsors[$choice], $selected)) $selected[] = $sponsors[$choice];
$loops++;
}
foreach($selected as $k => $selection) {
$op[] = '<p class="sponsorship bg_'.($k%3+1).'">Click the link below to<br />visit our Site Sponsor:<br />'.$selection.'</p>';
}
$op[] = '</div><!-- end sponsorship -->';
return join("\n",$op)."\n";
诉快速和v.v.脏......但它有效