shuffle() 是随机重排函数而非排序函数,会丢弃原键名、不保证加密安全,需保键或安全场景应选 array_rand() 或 fisher-yates 实现。

shuffle() 算排序函数,但不是「有序排序」函数——它属于随机重排函数,和 sort()、rsort() 这类按大小/自然顺序排列的函数有本质区别。
它的作用不是让数组变「有序」,而是让顺序变「不可预测」。PHP 官方文档在「Array Functions」分类下确实把它列在排序相关函数中,但语义上更接近「序列变换」而非「排序」。
shuffle() 会彻底丢掉原有键名
- 无论你传入的是索引数组还是关联数组,
shuffle()都会重置键名为 0 开始的连续整数。 - 原来的键(比如
"user_id"、"name")全部丢失,只保留值的随机顺序。
<?php $arr = ["a" => "apple", "b" => "banana", "c" => "cherry"]; shuffle($arr); print_r($arr); // 输出类似: // Array ( [0] => cherry [1] => apple [2] => banana ) ?>
- 如果你需要保留键值映射关系(比如打乱用户列表但还要知道每个用户 ID 对应哪条记录),
shuffle()就不适用。
shuffle() 不可重复、也不安全用于加密场景
- 它依赖 PHP 全局
mt19937随机数生成器,所有调用共享同一状态。 - 调用过
mt_srand(123)后,shuffle()的结果就可复现——这在测试中有时有用,但在生产环境可能带来意外交互。 - 官方明确警告:
shuffle()不可用于加密或需要密码学安全随机性的场合。要用random_int()或Random\Randomizer替代。
想打乱但保留键?得绕开 shuffle()
-
array_rand()是更合适的选择:它返回随机键名,不修改原数组。 - 或者手动实现「Fisher–Yates 洗牌」并维护键值对,例如:
<?php function shuffle_assoc(array $array): array {
$keys = array_keys($array);
shuffle($keys);
return array_replace_keys($keys, $array); // 需自己实现或用 array_intersect_key + array_values 组合
}
?>
但注意:PHP 没有原生 array_replace_keys(),所以真要保键,通常用 array_rand() + 循环构造新数组更稳妥。
关键点就一个:别把 shuffle() 当成 sort() 的随机版来用——它不排序,它重置;不保键,不安全;要什么,先想清楚再选函数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











