PHP shuffle 函数
最后修改于 2025 年 3 月 13 日
PHP 的 shuffle 函数可以随机打乱数组中元素的顺序。它会直接修改原始数组,成功时返回 true。
基本定义
shuffle 函数会随机重新排列数组元素。它使用伪随机数生成器来创建新的顺序。该函数既适用于索引数组也适用于关联数组。
语法:shuffle(array &$array): bool。请注意,它通过引用传递数组并直接修改它。数值键将从 0 开始重新索引。
基础 shuffle 示例
本例演示了如何对简单的数字索引数组进行 shuffle。
<?php $numbers = [1, 2, 3, 4, 5]; shuffle($numbers); print_r($numbers);
每次运行都会产生不同的输出,例如 [3, 1, 5, 2, 4]。原始数组顺序丢失,键从 0 开始重新索引。
Shuffle 关联数组
Shuffle 关联数组时,字符串键会丢失,并被数字索引替换。
<?php
$colors = [
'red' => '#FF0000',
'green' => '#00FF00',
'blue' => '#0000FF'
];
shuffle($colors);
print_r($colors);
输出可能是 Array ( [0] => #00FF00 [1] => #0000FF [2] => #FF0000 )。在 shuffle 过程中会丢失字符串键,这一点很重要。
Shuffle 时保留键
要在 shuffle 的同时保留键,我们可以结合使用 array_keys 和 array_values,并加入一些额外的逻辑。
<?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 外层数组还是内层数组。
<?php
$deck = [
['suit' => 'hearts', 'value' => 'K'],
['suit' => 'diamonds', 'value' => 'A'],
['suit' => 'clubs', 'value' => 'Q']
];
shuffle($deck);
print_r($deck);
这会打乱牌组中牌的顺序,同时保持每张牌的结构不变。内层数组保持不变,只有它们的顺序发生了变化。
创建随机样本
将 shuffle 与 array_slice 结合使用,可以从数组中获取一个随机样本。
<?php $students = ['Alice', 'Bob', 'Charlie', 'David', 'Eve']; shuffle($students); $randomThree = array_slice($students, 0, 3); print_r($randomThree);
这会从列表中选择 3 个随机学生。每次运行都会产生不同的结果,例如 ['David', 'Alice', 'Charlie']。
最佳实践
- 备份数据:如果需要原始顺序,请进行备份。
- 关联数组:请注意,键值对会丢失。
- 随机性:用于加密时,请使用加密安全函数。
- 性能:即使对于大型数组,shuffle 也非常高效。
来源
本教程介绍了 PHP 的 shuffle 函数,并通过实际示例展示了它在数组随机化场景中的用法。
作者
列出 所有 PHP 数组函数。