Как выбрать 10 случайных вещей из списка в PHP? - PullRequest
9 голосов
/ 07 августа 2009

Я знаю, как выбрать один случайный элемент из массива, но как насчет десяти случайных элементов из массива, скажем, двадцати элементов? (В PHP.)

Что немного усложняет то, что каждый элемент на самом деле состоит из двух частей: имени файла и описания. По сути, это веб-страница, которая будет отображать десять случайных изображений при каждой перезагрузке. Фактический формат этих данных не имеет большого значения, хотя он достаточно прост, и я бы предпочел, чтобы он содержался в виде простого текста или даже в жестком коде, а не в базе данных. (Это также не должно часто меняться.)

Бонусный вопрос, не уверен, собираюсь ли я сделать это только сейчас - но как бы вы взвесили записи, чтобы некоторые предметы всегда выбирались или, по крайней мере, чаще, чем другие?

Спасибо.

Ответы [ 7 ]

21 голосов
/ 07 августа 2009

Вы можете shuffle массив и затем выбрать первые десять элементов с помощью array_slice:

shuffle($array);
$tenRandomElements = array_slice($array, 0, 10);
16 голосов
/ 07 августа 2009

Как выбрать один или несколько случайных элементов из массива в php: http://us3.php.net/manual/en/function.array-rand.php

Как сделать случайные взвешенные элементы:
http://20bits.com/articles/random-weighted-elements-in-php/

3 голосов
/ 07 августа 2009

Пример # 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";
?>
0 голосов
/ 07 августа 2009

У меня есть код, который делает то, что вы просите. Я храню список спонсорских ссылок в текстовом файле и выбираю их случайным образом. Но, если я хочу наклонить набор, я использую несколько ссылок ;-)

Файл спонсора:

<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. быстро и в.в. грязно ... но работает

0 голосов
/ 07 августа 2009

Бонусный вопрос ответ: Взгляните на Выбор колеса рулетки . Веб-сайт рассказывает о алгоритмах, но методы выбора разумны и могут быть применены к ряду идей.

0 голосов
/ 07 августа 2009

Массив массивов в PHP должен быть хорошей стратегией. Вы можете хранить данные для этого массива любым способом (жестко запрограммированным, XML и т. Д.) И размещать их в массивах следующим образом:

Array {
    Array (item0) { filename,description, weight,...}
    Array (item1) { filename,description, weight,...}
    Array (item2) { filename,description, weight,...} 
}

Затем вы можете использовать функцию array_rand для случайного удаления элементов из массива. Создание значения веса для каждой записи позволит вам выбирать одну запись над другой, используя некую стратегию приоритета (например, случайным образом получить 2 элемента из массива, проверить вес, выбрать один элемент с большим весом и заменить другой)

0 голосов
/ 07 августа 2009
<?php
$inarray = range(0,100);
shuffle($inarray);
$outarray = array_slice($inarray, 0, 20);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...