ZetCode

PHP shuffle 函数

最后修改于 2025 年 3 月 13 日

PHP 的 shuffle 函数可以随机打乱数组中元素的顺序。它会直接修改原始数组,成功时返回 true。

基本定义

shuffle 函数会随机重新排列数组元素。它使用伪随机数生成器来创建新的顺序。该函数既适用于索引数组也适用于关联数组。

语法:shuffle(array &$array): bool。请注意,它通过引用传递数组并直接修改它。数值键将从 0 开始重新索引。

基础 shuffle 示例

本例演示了如何对简单的数字索引数组进行 shuffle。

basic_shuffle.php
<?php

$numbers = [1, 2, 3, 4, 5];
shuffle($numbers);

print_r($numbers);

每次运行都会产生不同的输出,例如 [3, 1, 5, 2, 4]。原始数组顺序丢失,键从 0 开始重新索引。

Shuffle 关联数组

Shuffle 关联数组时,字符串键会丢失,并被数字索引替换。

assoc_shuffle.php
<?php

$colors = [
    'red' => '#FF0000',
    'green' => '#00FF00',
    'blue' => '#0000FF'
];

shuffle($colors);
print_r($colors);

输出可能是 Array ( [0] => #00FF00 [1] => #0000FF [2] => #FF0000 )。在 shuffle 过程中会丢失字符串键,这一点很重要。

Shuffle 时保留键

要在 shuffle 的同时保留键,我们可以结合使用 array_keysarray_values,并加入一些额外的逻辑。

preserve_keys.php
<?php

function shuffle_assoc(array &$array): void {
    $keys = array_keys($array);
    shuffle($keys);
    
    $new = [];
    foreach ($keys as $key) {
        $new[$key] = $array[$key];
    }
    
    $array = $new;
}

$data = ['a' => 1, 'b' => 2, 'c' => 3];
shuffle_assoc($data);
print_r($data);

这个自定义函数在 shuffle 时会保持键值对不变。输出可能是 Array ( [b] => 2 [a] => 1 [c] => 3 ),顺序是随机的。

Shuffle 多维数组

对于多维数组,我们需要决定是 shuffle 外层数组还是内层数组。

multidimensional.php
<?php

$deck = [
    ['suit' => 'hearts', 'value' => 'K'],
    ['suit' => 'diamonds', 'value' => 'A'],
    ['suit' => 'clubs', 'value' => 'Q']
];

shuffle($deck);
print_r($deck);

这会打乱牌组中牌的顺序,同时保持每张牌的结构不变。内层数组保持不变,只有它们的顺序发生了变化。

创建随机样本

shufflearray_slice 结合使用,可以从数组中获取一个随机样本。

random_sample.php
<?php

$students = ['Alice', 'Bob', 'Charlie', 'David', 'Eve'];
shuffle($students);
$randomThree = array_slice($students, 0, 3);

print_r($randomThree);

这会从列表中选择 3 个随机学生。每次运行都会产生不同的结果,例如 ['David', 'Alice', 'Charlie']

最佳实践

来源

PHP Shuffle 文档

本教程介绍了 PHP 的 shuffle 函数,并通过实际示例展示了它在数组随机化场景中的用法。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章,至今已发表超过 1400 篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 PHP 数组函数