PHP数组右旋转推荐三次翻转法:先整体翻转,再翻转前k个,最后翻转后n−k个,时间O(n)、空间O(1);切片拼接法简洁但空间O(n),适用于可读性优先场景。

PHP 中实现数组元素右旋转,核心是把数组末尾的 k 个元素移到开头,其余元素顺次后移。关键在于处理 k 超过数组长度的情况(取模),以及避免额外空间开销(原地旋转更优)。
方法一:三次翻转(推荐,原地、高效、O(1) 空间)
利用翻转的可逆性:右旋 k 步 = 先整体翻转 → 再翻转前 k 个 → 最后翻转后 n−k 个。
- 先对整个数组翻转
- 再对索引 0 到 k−1 的子数组翻转
- 最后对索引 k 到 n−1 的子数组翻转
- 注意:k 需先对数组长度取模(
$k = $k % count($arr)),防止越界
示例代码:
function rotateRight(&$arr, $k) {
if (empty($arr)) return;
$n = count($arr);
$k = $k % $n;
if ($k == 0) return;
<pre class="brush:php;toolbar:false;">// 翻转整个数组
reverse($arr, 0, $n - 1);
// 翻转前 k 个
reverse($arr, 0, $k - 1);
// 翻转后 n-k 个
reverse($arr, $k, $n - 1);}
立即学习“PHP免费学习笔记(深入)”;
function reverse(&$arr, $start, $end) { while ($start
// 使用示例 $arr = [1, 2, 3, 4, 5, 6]; rotateRight($arr, 2); // 结果:[5, 6, 1, 2, 3, 4]
方法二:切片拼接(简洁,但生成新数组)
适合对空间不敏感、追求代码可读性的场景。用 PHP 数组切片函数直接截取并组合。
- 取后 k 个元素:
array_slice($arr, -$k) - 取前 n−k 个元素:
array_slice($arr, 0, $n - $k) - 合并:
array_merge($rightPart, $leftPart) - 同样需先做
$k %= count($arr)
示例代码:
function rotateRightSlice($arr, $k) {
if (empty($arr)) return $arr;
$n = count($arr);
$k = $k % $n;
if ($k == 0) return $arr;
<pre class="brush:php;toolbar:false;">$right = array_slice($arr, -$k);
$left = array_slice($arr, 0, $n - $k);
return array_merge($right, $left);}
边界与注意事项
- 空数组或单元素数组:直接返回,无需操作
- k 为负数:可转为等效正向左旋,或按需求抛异常/取绝对值后转右旋
-
k 大于数组长度:必须取模,否则
array_slice($arr, -$k)可能返回空或意外结果 - 引用传参(
&$arr)仅在原地修改时需要;切片法默认返回新数组,不影响原数组
性能对比简要说明
- 三次翻转:时间 O(n),空间 O(1),适合大数据量或内存受限场景
- 切片拼接:时间 O(n),空间 O(n),代码短、易理解,PHP 内部优化好,日常使用足够
- 不建议用循环逐个移动(O(n×k) 时间复杂度),尤其 k 接近 n 时效率极低











