shuffle() 就地打亂陣列順序,**重新索引數字鍵名**,關聯陣列的字串鍵名會遺失。
bool shuffle(array &$array)
$arr = range(1, 8); print_r($shuffle($arr)); // 每次執行結果不同,例如: // [0=>6, 1=>1, 2=>3, 3=>2, 4=>5, 5=>7, 6=>8, 7=>4]
$arr = ["a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5]; shuffle($arr); print_r($arr); // [0=>5, 1=>2, 2=>1, 3=>3, 4=>4] ← 原鍵名 a,b,c,d,e 遺失
function shuffle_assoc(array &$array) {
$keys = array_keys($array);
shuffle($keys);
$result = [];
foreach ($keys as $key) {
$result[$key] = $array[$key];
}
$array = $result;
return $array;
}
$arr = ["a"=>1, "b"=>2, "c"=>3];
shuffle_assoc($arr);
// 可能結果:["c"=>3, "a"=>1, "b"=>2] ← 鍵名保留
function rec_shuffle(array &$array) {
$keys = array_keys($array);
shuffle($keys);
$result = [];
foreach ($keys as $key) {
$val = $array[$key];
if (is_array($val)) {
rec_shuffle($val);
}
$result[$key] = $val;
}
$array = $result;
}
$data = [
'group1' => ['a', 'b', 'c'],
'group2' => ['x', 'y', 'z']
];
rec_shuffle($data); // 兩層皆打亂且保留鍵名
shuffle() 修改原陣列(參考傳遞),回傳 boolsrand() 播種,自動處理mt_srand(12345) 配合 shuffle()(但影響全域隨機狀態)掌握 shuffle() 重置鍵名特性,關聯陣列需自行實作保留鍵名版本,多維陣列遞迴處理即可滿足各種打亂需求。