Случайный выбор из массива.

Комментарии  (8)

А вот, понадобилась мне такая возможность PHP, как случайный выбор.
Для чего мне это понадобилось, просто надо было из папки с музыкой воспроизводить случайную мелодию, не спрашивайте зачам, просто надо и все. Кстати это можно использовать, и для вывода случайной картинки, и для вывода случайной фразы, ну в принципе не важно.
Ну я открыл книжку (бумажную, купил за деньги, толстая), начал там искать. И что вы думаете нашел, все уже есть. Как это выглядит,сейчас подробно покажу.

Как пример давайте сделаем выбор случайного афоризма или чего-нибудь, сейчас придумаю. Потому как пишу прямо сразу и без заготовок.

Так, для начала нам нужен текстовый файл, назовем его text.txt и запишем него наш текст.
Вот нашел, вместо афоризмов будут одностишья Ольги Арефьевой.

Выглядеть наш файл изнутри будет так:

1
2
3
4
5
Чем хуже голос, тем короче юбка..
Бессмертье радует лишь первые сто лет...
Томатный сок - кровь павших помидоров.
Не йог я. Так, выёживаюсь просто.
О, нервный тик! Иль всё же подмигнула?!

Каждое одностишие с новой строки и не оставлять пустые строки между и сверху. В принципе можно и оставлять, но придется просто кода больше писать для проверки потом.
Ну а теперь пишем:

1
2
3
4
5
6
$texts = file ("text.txt"); #Считали одностишия в массив
$kolvo = Count($texts)-1; #определили сколько элементов в массиве
$index = rand(0,$kolvo); #выбрали случайный
$stih = $texts[$index]; #присвоили его переменной
#И все, выводим случайное одностишие
echo $stih;

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

Функция file(): считываем в массив наш файл, каждая строка отдельный элемент массива.

Функция count(): позволяет узнать сколько у нас элементов массива в штуках, только обратите внимание на то, что там стоит «-1″. Для чего это? Все просто, индексы, как мы знаем, присваиваются элементам массива начиная с «0», соответственно у нас получается, что счетчик насчитал нам пять строк, а у последнего элемента индекс «4», вот чтобы выровнять это несоответствие мы и вычитаем единицу.

Далее функция rand() : что она делает, а эта функция выбирает случайное число в заданном диапазоне, у нас это между 0 и $kolvo. Ну, а $kolvo у нас в данном случае будет равен «4».

Теперь присваиваем переменной $stih элемент массива со случайным индексом.
И обыкновенное echo.
Не трудно? Не-а.

На основе этого можно еще, что-то придумать.
Думаете все? Снова не-а.

Я в моей умной книжке нашел еще одну функцию интересную, называется она:
array_rand(), работает она немного по другому.

Представьте что у вас в этом текстовом файле 100 строк и надо вывести 10 случайных, как будем делать?
Запустим цикл 10 раз и получим 10 случайных переменных.

А вот сейчас посмотрим как с этой ситуацией справится функция array_rand().
Вот новый код:

1
2
3
4
5
6
7
srand((float) microtime() * 10000000); # запустили генератор случайных чисел
$texts = file ("texts.txt"); #Считали тексты в массив
$stih = array_rand($texts, 2); #создали новый массив содержащий случайные ключи
echo "$texts[$stih[0]]";
#выводим первое случайное одностишие
echo "$texts[$stih[1]]";
#выводим второе случайное одностишие

Теперь посмотрим как работает этот код.

Первой строкой у нас строка запуска генератора случайных чисел, но если верить интернету, начиная с версии PHP 4.2.0 ее можно не указывать, так как в новых версиях этот генератор запускается автоматически.

Второй строкой опять считали в массив содержимое файла.

И самое интересное, функция array_rand().
Эта функция позволяет выбрать одно или несколько случайных значений из массива. В качестве параметров функция принимает
имя массива из которого надо выбрать и число которое задает сколько значений надо выбрать.

В нашем случае я предоставил функции массив $texts и решили выбрать из него два случайных элемента массива.
А возвращает эта функция в свою очередь массив случайно выбранных из основного массива ключей.
Последние две строки соответственно выводят нам первое и второе случайно выбранные одностишия.

Второй вариант получается очень удобны особенно если надо вывести, например из 100 строк 25 случайных. Мы одной строкой получаем массив случайных строк и потом стандартным проходом по массиву можем его весь вывести или сделать что нибудь еще.

Но первый способ мне нравится больше :) , я его сам придумал, независимо не от кого.
Товарищи специалисты если я тут неправильно, что-то написал не ругайтесь, но все работает :).

Пример
15
Авг
2009

8 Комментариев к статье:
“Случайный выбор из массива. ”

  1. Полезная фишка, использовал идею для написания простой каптчи по типу пять вопросов, пять ответов.

  2. Классно! Я как раз голову ломал, как сделать для своего сайта что-то вроде онлайн — гадания со случайно выпадающими картами :) Спасибо!

  3. Полезная фишка, использовал идею для генерации контента
    meta title
    meta description
    типа уникальный контент

  4. работает нормально
    echo $texts[$stih[0]]; #выводим первое случайное одностишье
    echo $texts[$stih[0]]; #выводим второе случайное одностишье

    p.s

    Parse error: syntax error, unexpected ‘[‘, expecting ‘]’ in /x/test.php on line 637

    Прошу прощения у уважаемых пользователей, но я полный чайник, и почитав статьи по основам, не понимаю причины происхождения данной ошибки:
    выдает ошибку
    echo «$texts[$stih[0]]»; #выводим первое случайное одностишье
    echo «$texts[$stih[0]]»; #выводим второе случайное одностишье

  5. ??????:
    Ну что тут можно сказать:
    Нужно внимательно проверить синтаксис, все кавычки и скобочки.

  6. Всё это хорошо наверное до тех пор пока элементы массива идут по порядку а что произойдёт если например отсутствуют какие то строки ? а подставляется именно эта строка ?!?!?

  7. 2-ой пример 6-я строка разве в квадратных скобках не 1?

  8. Совершенно верно, в данный момент одно и тоже выводится.
    Исправил.
    ЗЫ. копипаст враг.

Оставить комментарий