php shuffle实现
PHP shuffle 函数实现
PHP 的 shuffle 函数用于打乱数组的顺序,它会直接修改原数组而不是返回一个新的数组。以下是关于 shuffle 函数的详细说明和实现方法。
基本用法
shuffle 函数的语法如下:
bool shuffle ( array &$array )
- 参数
$array是要打乱顺序的数组,以引用方式传递。 - 返回值是一个布尔值,表示操作是否成功。
示例代码:

$array = [1, 2, 3, 4, 5];
shuffle($array);
print_r($array);
运行结果可能为:
Array
(
[0] => 3
[1] => 1
[2] => 5
[3] => 2
[4] => 4
)
实现原理
shuffle 函数内部使用 Fisher-Yates 洗牌算法,这是一种高效且均匀的随机打乱算法。以下是该算法的 PHP 实现:

function custom_shuffle(array &$array) {
$count = count($array);
for ($i = $count - 1; $i > 0; $i--) {
$j = mt_rand(0, $i);
if ($i !== $j) {
// 交换元素
$temp = $array[$i];
$array[$i] = $array[$j];
$array[$j] = $temp;
}
}
return true;
}
- 从数组末尾开始,随机选择一个位置交换元素。
- 时间复杂度为 O(n),确保每个排列的概率均等。
注意事项
-
shuffle会删除原数组的键名,重新索引为数字键(从 0 开始)。如果需要保留键名,可以使用array_rand或其他方法。示例保留键名的打乱方法:
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$keys = array_keys($array);
shuffle($keys);
$shuffled = [];
foreach ($keys as $key) {
$shuffled[$key] = $array[$key];
}
print_r($shuffled);
shuffle依赖于伪随机数生成器,如果需要更安全的随机性(如密码学用途),建议使用random_int替代mt_rand。
替代方案
如果不想修改原数组,可以结合 array_rand 实现:
$array = [1, 2, 3, 4, 5];
$shuffled = [];
$keys = array_rand($array, count($array));
foreach ($keys as $key) {
$shuffled[] = $array[$key];
}
print_r($shuffled);
这种方法会保留原数组,但效率略低于直接使用 shuffle。






