php数组左旋转推荐三次反转法:先全反转,再分段反转前(len−k)和后k位,时间o(n)、空间o(1);也可用array_merge拼接实现,简洁但空间o(n);原地循环替换最优但复杂。

PHP 中实现数组元素左旋转,核心是把前 n 个元素移到末尾,其余元素前移。不依赖额外数组、时间复杂度 O(n)、空间复杂度 O(1) 的高效做法,推荐用“三次反转法”。
三次反转法(推荐)
原理:左旋 k 位等价于先反转整个数组,再分别反转前 (len−k) 位和后 k 位。
例如:[1,2,3,4,5] 左旋 2 位 → [3,4,5,1,2]:
① 全反转:[5,4,3,2,1]
② 反转前 3 位(5−2):[3,4,5,2,1]
③ 反转后 2 位:[3,4,5,1,2]
- 需先对 k 取模:
$k = $k % count($arr),避免 k 超出数组长度 - 封装成函数更实用,支持索引数组(含数字/字符串键)
- 注意:PHP 数组键可能非连续或含字符串,若需保留原始键,应使用
array_values()提取值再操作,旋转后再映射回原键(或直接操作值)
使用 array_merge 简洁实现(适合小数组)
利用 PHP 内置函数拼接两段子数组,代码简短易懂:
function leftRotate($arr, $k) {
if (empty($arr)) return $arr;
$k = $k % count($arr);
return array_merge(array_slice($arr, $k), array_slice($arr, 0, $k));
}
- 自动处理空数组、k=0、k≥len 等边界情况
- 会重置数字键为 0 开始的连续索引;若需保留原始键,改用
+合并并手动调整顺序(但键顺序不保证) - 空间复杂度 O(n),适合开发调试或数据量不大的场景
原地循环替换(空间最优,稍复杂)
通过计算元素移动的环路,逐个将每个位置的值放到目标位置,避免额外空间:
立即学习“PHP免费学习笔记(深入)”;
- 适用于严格内存受限环境(如嵌入式 PHP 场景)
- 需记录已访问位置,防止重复移动;总移动次数恒为 n
- 实现时注意:当
gcd(n,k) > 1时存在多个独立环,需外层循环控制起始点 - 实际项目中较少手写,可作为算法理解补充
使用示例与注意事项
测试调用:
$arr = [1, 2, 3, 4, 5]; print_r(leftRotate($arr, 2)); // [3,4,5,1,2] print_r(leftRotate($arr, 7)); // k=7 → 7%5=2,结果同上
- 输入必须是索引数组;关联数组建议先用
array_values()标准化 - 修改原数组?上述函数均返回新数组;如需原地修改,可在函数内用引用传参 +
&$arr - 负数 k 可视为右旋转,按需统一转换:
$k = ($k % $n + $n) % $n得非负等效位数











