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

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

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

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

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

Перейти на сайт->

Бесплатный Курс "Практика HTML5 и CSS3"

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

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

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

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

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

Получить в подарок->

Бесплатный курс "Сайт на WordPress"

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

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


Генерация случайных строк в 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";
- то ли ноль, то ли буква "о" (опять-таки, русская или английская);
- и т.д.

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

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

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

Уважайте ваших пользователей, и они ответят вам взаимностью. Ну а я на этом заканчиваю, до встречи в новых материалах!

С уважением, Дмитрий Науменко

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

CodeIgniter: жив или мертв?

CodeIgniter: жив или мертв?

Функции обратного вызова, анонимные функции и механизм замыканий

Функции обратного вызова, анонимные функции и механизм замыканий

Применение функции к каждому элементу массива

Применение функции к каждому элементу массива

Слияние массивов. Преобразование массива в строку

Слияние массивов. Преобразование массива в строку

Деструктор и копирование объектов с помощью метода __clone()

Деструктор и копирование объектов с помощью метода __clone()

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

PHP: Удаление элементов массива

PHP: Удаление элементов массива

Ключевое слово final (завершенные классы и методы в PHP)

Ключевое слово final (завершенные классы и методы в PHP)

50 классных сервисов, программ и сайтов для веб-разработчиков

50 классных сервисов, программ и сайтов для веб-разработчиков

Наверх