Как выбрать 10 случайных вещей из списка в PHP?

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

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

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

спасибо.

7 ответов


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

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


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

shuffle($array);
$tenRandomElements = array_slice($array, 0, 10);

Пример #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";
?>

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

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

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


<?php
$inarray = range(0,100);
shuffle($inarray);
$outarray = array_slice($inarray, 0, 20);
?>

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


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

спонсоры:
<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";

В. быстрый и В. В. грязный... но это работает