W3docs

str_shuffle()

Статья о функции PHP str_shuffle(), которая случайным образом перемешивает символы строки. Рассматриваются синтаксис, примеры и предупреждения.

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

Синтаксис

str_shuffle(string $string): string

Параметры

  • $string (обязательный) — входная строка, символы которой требуется перемешать.

Возвращаемое значение

str_shuffle() возвращает новую строку, содержащую те же символы, что и $string, в случайном порядке. Исходная строка не изменяется, так как PHP передаёт значение по значению, а функция возвращает новую строку. Длина возвращаемой строки всегда совпадает с длиной входной.

Базовый пример

php— editable, runs on the server

Здесь $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() — заменяет вхождения подстроки.

Практика

Практика
Чего можно достичь с помощью функции str_shuffle() в PHP?
Чего можно достичь с помощью функции str_shuffle() в PHP?
Was this page helpful?