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().
Расширенные примеры
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] => Бобик
)$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
)$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♠
)$students = ['Аня', 'Боря', 'Витя', 'Галя', 'Даня', 'Егор'];
shuffle($students);
$groups = array_chunk($students, 2);
print_r($groups);Array
(
[0] => Array
(
[0] => Боря
[1] => Аня
)
[1] => Array
(
[0] => Егор
[1] => Витя
)
[2] => Array
(
[0] => Даня
[1] => Галя
)
)Аналоги в других языках
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(), что может быть ресурсоемко на больших таблицах.