Shuffle: примеры (PHP)

Рандомизация массивов: применение shuffle в PHP
Раздел: Работа с массивами
shuffle(array &array): bool

Функция shuffle в PHP

Описание

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

Аргументы

Функция принимает один обязательный параметр:

  • &$array (массив) - передается по ссылке. Функция изменяет исходный массив, перемешивая его элементы.

Функция возвращает логическое значение: true в случае успеха и false при возникновении ошибки (например, если передан не массив). Начиная с PHP 7.1, внутренний алгоритм генерации случайных чисел использует механизм Mersenne Twister, а не устаревший rand().

Примеры использования

Перемешивание простого массива
$numbers = [1, 2, 3, 4, 5];
shuffle($numbers);
print_r($numbers);
// Результат будет разным при каждом запуске, например:
Array
(
    [0] => 4
    [1] => 1
    [2] => 5
    [3] => 2
    [4] => 3
)
Работа с ассоциативным массивом
$assocArray = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];
shuffle($assocArray);
print_r($assocArray);
// Ключи массива будут потеряны и заменены числовыми индексами:
Array
(
    [0] => banana
    [1] => apple
    [2] => cherry
)

Похожие функции в PHP

  • array_rand($array, $num = 1) - возвращает один или несколько случайных ключей из массива. Не изменяет исходный массив. Удобна для выбора случайного элемента без потери ключей.
  • rsort(), sort() - сортируют массив в обратном или прямом порядке, но не случайным образом.
  • usort($array, $callback) - сортирует массив по пользовательской функции сравнения. Можно реализовать случайную сортировку, но это менее эффективно.
  • Рекомендация: shuffle() применяется, когда важен именно случайный порядок всех элементов. array_rand() лучше подходит для выбора одного или нескольких случайных элементов с сохранением ключей.

Типичные ошибки

Передача не массива
$string = 'hello';
$result = shuffle($string);
var_dump($result);
bool(false)
// Также будет сгенерировано предупреждение.
Потеря ключей ассоциативного массива
$data = ['name' => 'John', 'age' => 30];
shuffle($data);
// Ожидание сохранить ключи 'name' и 'age' ошибочно.
print_r($data);
Array
(
    [0] => John
    [1] => 30
)
Попытка использовать результат как массив
$arr = [1, 2, 3];
$newArray = shuffle($arr); // $newArray содержит true/false, а не массив!
var_dump($newArray);
bool(true)

Изменения в новых версиях PHP

  • В PHP 7.1 функция shuffle() стала использовать внутренний генератор псевдослучайных чисел (CSPRNG), заменив устаревший rand(). Это улучшило равномерность распределения.
  • В PHP 8.0 не было внесено значительных изменений в поведение shuffle, но общие улучшения системы типов делают передачу не массива более предсказуемой (генерация TypeError в строгом режиме).
  • Ранние версии PHP (до 4.2.0) автоматически не инициализировали генератор случайных чисел, что требовалось делать вручную с помощью srand().

Расширенные примеры

Перемешивание с сохранением ключей
Пример php
function shuffleAssoc(&$array) {
    $keys = array_keys($array);
    shuffle($keys);
    $new = [];
    foreach($keys as $key) {
        $new[$key] = $array[$key];
    }
    $array = $new;
    return true;
}

$items = ['cat' => 'Мурзик', 'dog' => 'Бобик', 'fish' => 'Немо'];
shuffleAssoc($items);
print_r($items);
Array
(
    [fish] => Немо
    [cat] => Мурзик
    [dog] => Бобик
)
Создание случайной последовательности для тестов
Пример php
$questions = range(1, 20); // Номер вопросов 1..20
shuffle($questions);
// Выбрать первые 5 случайных вопросов:
$testSet = array_slice($questions, 0, 5);
sort($testSet); // Для удобства чтения
print_r($testSet);
Array
(
    [0] => 3
    [1] => 7
    [2] => 12
    [3] => 15
    [4] => 18
)
Имитация тасования колоды карт
Пример php
$suits = ['♠', '♥', '♦', '♣'];
$values = ['2','3','4','5','6','7','8','9','10','J','Q','K','A'];
$deck = [];
foreach ($suits as $suit) {
    foreach ($values as $value) {
        $deck[] = $value . $suit;
    }
}
shuffle($deck);
// Раздача 5 карт:
$hand = array_slice($deck, 0, 5);
print_r($hand);
Array
(
    [0] => 9♥
    [1] => K♠
    [2] => 6♦
    [3] => A♣
    [4] => 3♠
)
Случайное разбиение на группы
Пример php
$students = ['Аня', 'Боря', 'Витя', 'Галя', 'Даня', 'Егор'];
shuffle($students);
$groups = array_chunk($students, 2);
print_r($groups);
Array
(
    [0] => Array
        (
            [0] => Боря
            [1] => Аня
        )
    [1] => Array
        (
            [0] => Егор
            [1] => Витя
        )
    [2] => Array
        (
            [0] => Даня
            [1] => Галя
        )
)

Аналоги в других языках

Python (random.shuffle)
import random
my_list = [1, 2, 3, 4, 5]
random.shuffle(my_list)
print(my_list)
# Пример вывода: [3, 1, 5, 2, 4]

Аналогично PHP, изменяет исходный список. Для неизменяемой последовательности используют random.sample().

Shuffle в Javascript

let array = [1, 2, 3, 4, 5];
array.sort(() => Math.random() - 0.5);
console.log(array);
// Пример вывода: [2, 5, 1, 4, 3]

В JavaScript нет встроенной функции shuffle, поэтому используют метод sort со случайной функцией сравнения. Алгоритм Фишера-Йетса считается более надежным.

Shuffle в MySQL

Прямого аналога нет. Для случайного порядка выборки используют ORDER BY RAND(), что может быть ресурсоемко на больших таблицах.

PHP shuffle function comments

En
Shuffle Shuffle an array