PHP 內置 shuffle() 已高度優化,但理解其背後演算法有助於面試與特殊場景(如需確定性種子)。本文展示一個基於「隨機索引插入」的自定義實現,並對比效能。
function randomizeArray(array $array): array {
$result = [];
$max = count($array) + 10; // 擴大索引空間減少碰撞
while (!empty($array)) {
$element = array_shift($array);
$idx = random_int(0, $max);
while (isset($result[$idx])) {
$idx = random_int(0, $max);
}
$result[$idx] = $element;
}
ksort($result); // 按索引排序
return array_values($result); // 重置鍵名
}
$arr = ['why', 'dont', 'visit', 'www', 'jonas', 'john', 'de', ':-)'];
echo "原始: " . implode(', ', $arr) . "\n";
echo "打亂: " . implode(', ', randomizeArray($arr)) . "\n";
// 內置函數一行搞定
shuffle($arr);
echo "shuffle: " . implode(', ', $arr) . "\n";
shuffle() 使用 Fisher-Yates 洗牌演算法,原地操作,O(n) 且無額外空間,效能更優。function seededShuffle(array &$array, int $seed): void {
mt_srand($seed);
$n = count($array);
for ($i = $n - 1; $i > 0; $i--) {
$j = mt_rand(0, $i);
[$array[$i], $array[$j]] = [$array[$j], $array[$i]];
}
}
適用於測試、遊戲邏輯、分佈式一致性分片等場景。