
Reg.ru: домены и хостинг
Крупнейший регистратор и хостинг-провайдер в России.
Более 2 миллионов доменных имен на обслуживании.
Продвижение, почта для домена, решения для бизнеса.
Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс "Практика HTML5 и CSS3"
Освойте бесплатно пошаговый видеокурс
по основам адаптивной верстки
на HTML5 и CSS3 с полного нуля.

Фреймворк 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[mt_rand(0, $characters_length)]; } // Возвращаем результат 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[1];
то тогда последний элемент можно было бы получить, написав следующее (ведь в массиве у нас 62 элемента):
$str_characters[62];
Это было бы вполне логично, но, к сожалению, неверно.
В действительности первый элемент доступен через
$str_characters[0];
а 62 элемент (последний) через
$str_characters[61];
Вы можете убедиться в этом просто выведя на экран данные значения.
Теперь становится совершенно понятно, для чего мы вычитали из 62 единицу. Только лишь для того, чтобы диапазон наших индексов был от 0 до 61. Именно это обеспечит нам корректное формирование случайной строки без вероятности случайно обратиться к несуществующему элементу с индексом 62.
Вот и все. Возвращаем значение с помощью оператора return - и наша функция готова.
Осталось вызвать ее и передать в качестве параметра желаемое количество символов в нашей случайной строке, например так:
echo random_string(16,$str_characters);
В результате мы получим нечто совершенно бессвязное, вроде:
aTq4Lh9PNEm8cCxp
Цель достигнута, и теперь мы можем творчески применять нашу функцию там, где это необходимо.
Разумеется, наша функция универсальна и прекрасно работает также с русским языком. В коде выше вы можете увидеть еще один вариант массива $str_characters (он закомментирован), который содержит кириллические символы.
Для того, чтобы в этом убедиться, мы можем закомментировать первый массив $str_characters (с латинскими символами) и раскомментировать второй.
Теперь, если мы обновим страницу, то получим что-то вроде:
жюю4д70ю779вхо5я
Таким образом, вы можете использовать любые символы, какие только захотите. Для этого вы можете или добавить их в уже существующий массив, либо создать новый.
И напоследок одно замечание, которое может быть полезно.
Уверен, что вы, как пользователь, встречались со случайно сгенерированными паролями, в которых едва ли можно понять, что что же это за символ:
- то ли маленькая буква "l", то ли цифра "1";
- то ли русская "с", то ли английская "c";
- то ли русская "у", то ли английская "y";
- то ли ноль, то ли буква "о" (опять-таки, русская или английская);
- и т.д.
Поэтому, если вы сами генерируете какую-то строку для других пользователей, стоит позаботиться о том, чтобы она точно была им понятна. Представьте, что вы оказались на месте другого человека и гадаете: "Что же это такое?", "Буква это или цифра, черт возьми?"
В итоге, так и не разобрав, что это, вы вынуждены либо просто копировать строку, либо методом исключения выяснять, что же за символы в нее входят.
Согласитесь, что это очень неудобно и вряд ли может кому-то понравиться. Поэтому при выборе символов, из которых будет состоять строка, старайтесь сделать так, чтобы не было похожих по начертанию букв и цифр и, тем более, вряд ли стоит смешивать разные языки, чтобы окончательно не запутать человека.
Уважайте ваших пользователей, и они ответят вам взаимностью. Ну а я на этом заканчиваю, до встречи в новых материалах!
С уважением, Дмитрий Науменко
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: