猿问

php中数组的右旋转

例如我有一个数组

$a = [1,2,3,4,5];

由此$a,如何获取最后一个数组并将其设置为第一个[5,1,2,3,4] ,以及如何获取最后两个数组以使其像[4,5,1,2,3]


四季花海
浏览 113回答 4
4回答

呼如林

您可以组合使用array_pop(),这会弹出数组的最后一个元素,并将array_unshift()其推到数组的前面。您可以为此创建一个简单的函数,function array_pop_unshift($array) {&nbsp; &nbsp; array_unshift($array, array_pop($array));&nbsp; &nbsp; 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++) {&nbsp; &nbsp; $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) {&nbsp; &nbsp; $length = count($array);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; end($array);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; while ($step--)&nbsp; &nbsp; &nbsp; &nbsp; prev($array);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; while ($length--) {&nbsp; &nbsp; &nbsp; &nbsp; next($array);&nbsp; &nbsp; &nbsp; &nbsp; if (key($array) === null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reset($array);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; yield current($array);&nbsp; &nbsp; }}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{&nbsp; &nbsp; $count = count($indexedArray);&nbsp; &nbsp; if ($count < 2) {&nbsp; &nbsp; &nbsp; &nbsp; return $indexedArray; // array cannot be rotated&nbsp; &nbsp; }&nbsp; &nbsp; $remainder = $popShiftsCount % $count;&nbsp; &nbsp; if (!$remainder) {&nbsp; &nbsp; &nbsp; &nbsp; return $indexedArray; // sought rotation is the original order&nbsp; &nbsp; }&nbsp; &nbsp; return array_merge(&nbsp; &nbsp; &nbsp; &nbsp; array_splice($indexedArray, -$remainder),&nbsp; &nbsp; &nbsp; &nbsp; $indexedArray&nbsp; &nbsp; );}披露:这个答案是建立在 CodeReview 页面(PHP 中的 Codility 循环轮换解决方案)上的,我在评论中提供了这个片段。

慕码人8056858

您实际上是在进行右旋转,而不是左旋转。无论如何,这里有执行这两个操作的函数。它们可能不是最有效的,但它们的代码很短并且非常不言自明:<?php&nbsp; &nbsp; function rotateLeft($array, $times) {&nbsp; &nbsp; &nbsp; &nbsp; for($i=0; $i<$times; $i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $array[] = array_shift($array);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return $array;&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; function rotateRight($array, $times) {&nbsp; &nbsp; &nbsp; &nbsp; for($i=0; $i<$times; $i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array_unshift($array, array_pop($array));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return $array;&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; $a = [1,2,3,4,5];&nbsp;&nbsp; &nbsp; $a = rotateRight($a, 1);&nbsp; &nbsp; print_r($a);?>
随时随地看视频慕课网APP
我要回答