str_shuffle()
Статья о функции PHP str_shuffle(), которая случайным образом перемешивает символы строки. Рассматриваются синтаксис, примеры и предупреждения.
Функция PHP str_shuffle() случайным образом переставляет символы строки и возвращает результат в виде новой строки. Каждый символ исходной строки сохраняется ровно один раз — меняются только их позиции — поэтому результат всегда является анаграммой входной строки той же длины. На этой странице описаны синтаксис, возвращаемое значение, запускаемые примеры, типичные ловушки (включая важное предупреждение безопасности) и связанные функции.
Синтаксис
str_shuffle(string $string): stringПараметры
$string(обязательный) — входная строка, символы которой требуется перемешать.
Возвращаемое значение
str_shuffle() возвращает новую строку, содержащую те же символы, что и $string, в случайном порядке. Исходная строка не изменяется, так как PHP передаёт значение по значению, а функция возвращает новую строку. Длина возвращаемой строки всегда совпадает с длиной входной.
Базовый пример
Здесь $string содержит "Hello, World!". str_shuffle() случайным образом переставляет 13 символов и возвращает перемешанный результат, который мы сохраняем в $shuffled и выводим. Так как порядок случаен, при каждом запуске вы будете видеть разный результат — однако все буквы, запятая, пробел и восклицательный знак по-прежнему присутствуют.
Генерация случайной строки или токена
Распространённый сценарий — создание короткого случайного кода путём перемешивания набора допустимых символов и взятия первых нескольких:
<?php
$pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$code = substr(str_shuffle($pool), 0, 6);
echo $code; // e.g. "K3PQ8A"Это гарантирует отсутствие повторяющихся символов в коде, поскольку каждый символ пула встречается после перемешивания не более одного раза.
Предупреждение безопасности: не используйте для паролей или токенов
str_shuffle() не является криптографически безопасной функцией. Внутри она использует генератор псевдослучайных чисел общего назначения PHP, который предсказуем и не подходит для задач, связанных с безопасностью. Никогда не используйте её для генерации паролей, идентификаторов сессий, токенов сброса пароля или ключей API.
Для безопасных случайных значений используйте random_int() или random_bytes():
<?php
// Cryptographically secure 16-character token
echo bin2hex(random_bytes(8)); // e.g. "9f2c1ab07e3d4501"Работа с многобайтовыми (UTF-8) строками
str_shuffle() работает с байтами, а не с символами Unicode. Для простого ASCII-текста это одно и то же, но для многобайтового текста (например, символы с диакритическими знаками или нелатинские символы) функция может разбить один символ по границам байтов и вернуть некорректный результат:
<?php
// "héllo" — the é is two bytes in UTF-8, so shuffling bytes can corrupt it
echo str_shuffle("héllo"); // may produce broken charactersЕсли требуется безопасно перемешать символы Unicode, сначала разбейте строку на символы (например, с помощью preg_split('//u', ...)), перемешайте массив и соберите строку обратно.
Примечания и подводные камни
- Перемешивание равномерно в том смысле, что каждая перестановка равновероятна, однако результат не детерминирован — вы не можете задать начальное значение напрямую. (Инициализация глобального генератора через
mt_srand()влияет на него в старых версиях PHP, но полагаться на это не рекомендуется.) - Передача пустой строки возвращает пустую строку.
- Повторяющиеся символы остаются повторяющимися — перемешивание
"aaa"всегда возвращает"aaa". - Исходная переменная не изменяется; присвойте возвращаемое значение, чтобы сохранить результат.
Связанные функции
shuffle()— случайным образом переставляет элементы массива (не строки).str_split()— разбивает строку на массив символов, что полезно для безопасного перемешивания многобайтовых строк.mt_rand()— генерирует случайное целое число.str_repeat()— повторяет строку заданное количество раз.str_replace()— заменяет вхождения подстроки.