Выбрать один элемент из генератора в php. Генераторы в PHP

Жаропонижающие средства для детей назначаются педиатром. Но бывают ситуации неотложной помощи при лихорадке, когда ребенку нужно дать лекарство немедленно. Тогда родители берут на себя ответственность и применяют жаропонижающие препараты. Что разрешено давать детям грудного возраста? Чем можно сбить температуру у детей постарше? Какие лекарства самые безопасные?

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

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

Верстайте на заказ и получайте деньги.

*Наведите курсор мыши для приостановки прокрутки.

Назад Вперед

Генерация случайных строк в PHP

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

Подобная задача может возникнуть в самых разных ситуациях, например:

Создание случайного пароля из предустановленного набора символов;

Генерация случайного имени для файла или папки (в целях их скрытия и защиты);

Создание временного уникального идентификатора для какого-либо процесса;

Использование случайной строки в качестве "исходного материала" для более сложного скрипта и т.д.

При творческом подходе можно найти и другие сферы применения случайных строк.

В PHP нет специальной функции, которая выполняла бы интересующую нас задачу, поэтому такой инструмент нужно писать самому под свои нужды.

Ниже привожу один из вариантов решения этой задачи.

// Функция принимает 2 параметра: длину случайной строки и символы, которые участвуют в ее формировании function random_string ($str_length, $str_characters) { $str_characters = array (0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"); // Функция может генерировать случайную строку и с использованием кириллицы //$str_characters = array (0,1,2,3,4,5,6,7,8,9,"а","б","в","г","д","е","ж","з","и","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","э","ю","я"); // Возвращаем ложь, если первый параметр равен нулю или не является целым числом if (!is_int($str_length) || $str_length < 0) { return false; } // Подсчитываем реальное количество символов, участвующих в формировании случайной строки и вычитаем 1 $characters_length = count($str_characters) - 1; // Объявляем переменную для хранения итогового результата $string = ""; // Формируем случайную строку в цикле for ($i = $str_length; $i > 0; $i--) { $string .= $str_characters; } // Возвращаем результат return $string; }

Поскольку материал рассчитан на новичков, сделаю пояснения по работе данной функции.

Сама функция генерации случайной строки принимает два параметра. Первый - количество символов, которое мы хотим видеть в результирующей строке. Второй - непосредственно массив символов, которые мы хотим использовать при генерации.

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

Если первый параметр корректный, то мы подсчитываем количество символов, участвующих в формировании строки с помощью функции count() и вычитаем из получившегося числа единицу. Для чего мы это делаем? На этот вопрос я отвечу чуть позже, а пока идем дальше по функции.

Объявив переменную $string для хранения итогового результата, мы приступаем к формированию случайной строки в цикле for .

В качестве начального значения счетчика $i цикла выступает количество символов, которое мы хотим увидеть в случайной строке ($str_length).

Затем идет условие, что цикл должен выполняться до тех пор, пока значение счетчика больше нуля.

Наконец, после каждой итерации цикла мы уменьшаем значение счетчика на единицу с помощью оператора декремента "--".

Таким образом, в цикле будет совершено столько итераций, сколько символов мы хотим получить в итоговой строке.

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

Как вы видите, итоговую строку мы формируем, последовательно добавляя к переменной $string по одному символу за каждый проход по циклу.

Давайте посмотрим детальнее.

Мы используем функцию mt_rand() и передаем ей два параметра - ноль и ту самую уменьшенную на единицу переменную $characters_length . Функция mt_rand() позволяет нам просто сгенерировать случайное число в заданном диапазоне (т.е. от нуля до $characters_length ).

Смысл использования этой функции в том, что с ее помощью мы создаем случайное число, которое используется как индекс для массива $str_characters .

Индекс указывает на то, какой именно символ из массива $str_characters мы хотим получить.

Вот мы и подошли к ключевому моменту. Если бы первый элемент мы получали с помощью конструкции вида

$str_characters;

то тогда последний элемент можно было бы получить, написав следующее (ведь в массиве у нас 62 элемента):

$str_characters;

Это было бы вполне логично, но, к сожалению, неверно.

В действительности первый элемент доступен через

$str_characters;

а 62 элемент (последний) через

$str_characters;

Вы можете убедиться в этом просто выведя на экран данные значения.

Теперь становится совершенно понятно, для чего мы вычитали из 62 единицу. Только лишь для того, чтобы диапазон наших индексов был от 0 до 61. Именно это обеспечит нам корректное формирование случайной строки без вероятности случайно обратиться к несуществующему элементу с индексом 62.

Вот и все. Возвращаем значение с помощью оператора return - и наша функция готова.

Осталось вызвать ее и передать в качестве параметра желаемое количество символов в нашей случайной строке, например так:

Echo random_string(16,$str_characters);

В результате мы получим нечто совершенно бессвязное, вроде:

ATq4Lh9PNEm8cCxp

Цель достигнута, и теперь мы можем творчески применять нашу функцию там, где это необходимо.

Разумеется, наша функция универсальна и прекрасно работает также с русским языком. В коде выше вы можете увидеть еще один вариант массива $str_characters (он закомментирован), который содержит кириллические символы.

Для того, чтобы в этом убедиться, мы можем закомментировать первый массив $str_characters (с латинскими символами) и раскомментировать второй.

Теперь, если мы обновим страницу, то получим что-то вроде:

Жюю4д70ю779вхо5я

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

И напоследок одно замечание, которое может быть полезно.

Уверен, что вы, как пользователь, встречались со случайно сгенерированными паролями, в которых едва ли можно понять, что что же это за символ:

То ли маленькая буква "l", то ли цифра "1";
- то ли русская "с", то ли английская "c";
- то ли русская "у", то ли английская "y";
- то ли ноль, то ли буква "о" (опять-таки, русская или английская);
- и т.д.

Поэтому, если вы сами генерируете какую-то строку для других пользователей, стоит позаботиться о том, чтобы она точно была им понятна. Представьте, что вы оказались на месте другого человека и гадаете: "Что же это такое?", "Буква это или цифра, черт возьми?"

Привет всем, сегодня я расскажу Вам о генерации случайных чисел в PHP . Благодаря лишь одной функции мы можем получить случайное число из заданного диапазона, что является довольно полезной задачей. Например, вы сможете вывести случайные записи на сайте, также можно реализовать капчу. Называется данная функция mt_rand , в качестве параметров Вы можете ничего не указывать, и тогда данная функция будет возвращать случайное число от нуля до максимально поддерживаемого значения. Наврятли Вам понадобится данная функция без использования параметров, но все же для того чтобы Вы знали о необязательной возможности их указывать я Вам это пояснил. Два параметра, которые можно задать в данной функции, это минимальное значение и максимальное значение, а Вам будет возвращено число из этого диапазона значений. Осталось лишь показать Вам пример ее использования.

echo mt_rand(). "
" ;

echo mt_rand(-5 , 7 ). "
" ;

echo mt_rand(3 , 20 ). "
" ;

?>

Теперь я предлагаю Вам посмотреть на результат выполнения нашего кода. Я не буду показывать картинку, т.к., при каждом обновлении страницы результат будет меняться. В первом случаем вы получите случайное число. Во втором в диапазоне от минус пяти до семи, и в третьем от трех до двадцати. Как видите, вы можете указывать и отрицательный диапазон, поэтому я привел Вам три примера. Больше о данной функции рассказать нечего, до скорого!

А теперь берем уже готовую функцию генерации пароля и пишем скрипт для восстановления или создания нового пароля для пользователей вашего сайта.

Скрипт восстановления пароля

Как обычно пишется скрипт?

Как всегда составляется поэтапная схема, что мы должны сделать по шагам. Все происходит в одном файле, reminder.php

1. Запускаем скрипт, только при наличии определенной переменной, например $action;

2. Для запуска процесса генерации пароля, пользователь указывает email адрес $_POST[`ema‘l`]; Для упрощения кода присвоим данное значение переменной $email.

3. Проверяем при помощи регулярных выражений все символы на то, чтобы пользователь правильно указал адрес емайл. Если нет, выводим ошибку, прекращаем работу скрипта. Если все правильно, идем дальше.

4. Ищем в базе данных, в нашем случае в таблице users пользователя с таким почтовым адресом. Если нет, выдаем ошибку, что такого адреса в базе нет, и прекращаем работу скрипта.

5. Пользователь с таким адресом в базе есть, идем дальше и запускаем функцию генерации нового пароля. Также по адресу емайл получаем из базы уникальный id пользователя и пишем в переменную $id;

Предлагаю вашему вниманию свое решение по генерации html на PHP. Задача вроде бы тривиальная, но хотелось бы, чтобы это было расширяемо, кратко, но в тоже время с хорошим функционалом. Получилось вроде не плохо.

Сразу скажу(как многие считают в комментариях), что задача ставилось не написать шаблонизатор (которых и так много) и не заменить шаблонизатор JavaScript. Я прекрасно знаю, что true way это разделять html и данные. Но мне понадобилось писать html в классах, для создания компонентов фреймворка, на подобие CGridView в yii, стоит ли в таких местах выносить html в отдельные файлы решать вам.

Основная цель, избавится от html в классах и функциях.

Простой пример, обычная кнопка:

CHtml::create() ->p() ->a(array("href" => "http://habrahabr.ru", "class" => "btn")) ->text("Перейти") ->render();
Результат:

Перейти

Ничего хитрого, можно было бы этим и ограничется, но захотелось циклы:
$arr = array("1" => "Первый", "2" => "Второй"); CHtml::create() ->select($options) ->each(CHtml::plainArray($arr, "value", "text")) ->option("array("value" => $data->value)") ->text("$data->text") ->end() ->endEach()
Тут понадобилось вызвать функцию plainArray() которая превращает массив в виде:
$arr = array(array("value" => "1", "text" =>"Первый"), array("value" => "2", "text" => "Второй"));
Теги внутри цикла могут содержать функции или строки с eval выражениями, вложенность любая, пример с таблицей:

$columns = array(array("id" => "NAME", "label" => "Имя"), array("id" => "AGE", "label" => "Возраст")); $data = array(array("NAME" => "Петр", "AGE" => 29), array("NAME" => "Василий", "AGE" => 32)); CHtml::create() ->table() ->thead() ->tr() ->each($columns) ->th() ->text(function($column){ return $column["label"]; }) ->end() ->endEach() ->end() ->end() ->tbody() ->each($data) ->tr() ->each($columns) ->td() ->text(function($row, $column) { return $row[$column["id"]]; }) ->end() ->endEach() ->end() ->endEach() ->render();

Незакрытые теги закрываются автоматически.

Класс можно расширить, вплоть до использования в формах. Расширить можно за счет наследования или внедрения зависимости, за то, как будет выводится каждый тег и его атрибуты используется одна функция, поэтому можно легко переопределить это поведение.

Class CMyHtml extends CHtml { public function a($options = array()) { $default = array("href" => "javascript:void(0)"); return parent::a(array_replace($default, $options)); } }

Class CForm { private $_lastLabel = ""; public function __construct(CModel $model, CHtml $html = null) { $this->_model = $model; $this->_html = $html ?: CHtml::create(); } public function __call($method, $ps) { $options = $ps ? $ps: array(); if ($method === "label") { $this->_lastLabel = isset($options["for"]) ? $this->_model->getLabel($options["for"]) : ""; } if ($method === "text" && $this->_lastLabel) { $options = $options ?: $this->_lastLabel; $this->_lastLabel = ""; } $this->_html->$method($options); return $this; } }

Само решение можно посмотреть и попробовать на

Поддержите проект — поделитесь ссылкой, спасибо!
Читайте также
Гречка с фаршем рецепт на сковороде Гречка с фаршем и овощами на сковороде Гречка с фаршем рецепт на сковороде Гречка с фаршем и овощами на сковороде Профессия Проходчик.  Кто такой Проходчик. Описание профессии. Вакансии проходчика для работы вахтой Проходчик профессия Профессия Проходчик. Кто такой Проходчик. Описание профессии. Вакансии проходчика для работы вахтой Проходчик профессия «Из тьмы веков» Идрис Базоркин Из тьмы веков читать «Из тьмы веков» Идрис Базоркин Из тьмы веков читать