-
呼如林
您可以组合使用array_pop(),这会弹出数组的最后一个元素,并将array_unshift()其推到数组的前面。您可以为此创建一个简单的函数,function array_pop_unshift($array) { array_unshift($array, array_pop($array)); return $array;}然后将其用作$a = [1,2,3,4,5];$new = array_pop_unshift($a);print_r($new); // [5,1,2,3,4]要继续移动它,只需再次调用该函数直到完成,例如通过循环for,$a = [1,2,3,4,5];for ($i = 0; $i < 2; $i++) { $new = array_pop_unshift($a);}print_r($new); // [4,5,1,2,3]现场演示https://3v4l.org/CoJZZ
-
杨魅力
array_unshift如果您想避免多个and的成本array_pop,您可以构建一个使用数组内部指针的生成器。如果您确实需要结果数组,请使用以下方法iterator_to_array()创建它:$a = range(1,5);function rotate(&$array, $step = 1) { $length = count($array); end($array); while ($step--) prev($array); while ($length--) { next($array); if (key($array) === null) reset($array); yield current($array); }}print_r(iterator_to_array(rotate($a, 2))); // [4,5,1,2,3]演示请注意,rotate()生成器使用引用来避免数组复制,但不会修改原始数组:它仅将数组指针从所选位置移动 n 次(其中 n 是数组长度)。当数组指针超出数组时(key()返回null),数组指针将被重置。换句话说,即使有一个大数组和多次旋转(我在代码中称之为“步骤”),它仍然保持高效。
-
SMILET
不要迭代调用array_pop()和array_unshift(),而是使用一种高效、优雅的方法来减少函数调用并具有尽可能低的时间复杂度。使用提前返回可以防止对相同结果进行不必要的函数调用。代码:(演示)function popUnshift(array $indexedArray, int $popShiftsCount): array{ $count = count($indexedArray); if ($count < 2) { return $indexedArray; // array cannot be rotated } $remainder = $popShiftsCount % $count; if (!$remainder) { return $indexedArray; // sought rotation is the original order } return array_merge( array_splice($indexedArray, -$remainder), $indexedArray );}披露:这个答案是建立在 CodeReview 页面(PHP 中的 Codility 循环轮换解决方案)上的,我在评论中提供了这个片段。
-
慕码人8056858
您实际上是在进行右旋转,而不是左旋转。无论如何,这里有执行这两个操作的函数。它们可能不是最有效的,但它们的代码很短并且非常不言自明:<?php function rotateLeft($array, $times) { for($i=0; $i<$times; $i++){ $array[] = array_shift($array); } return $array; } function rotateRight($array, $times) { for($i=0; $i<$times; $i++){ array_unshift($array, array_pop($array)); } return $array; } $a = [1,2,3,4,5]; $a = rotateRight($a, 1); print_r($a);?>