为了账号安全,请及时绑定邮箱和手机立即绑定

php中数组的右旋转

php中数组的右旋转

PHP
四季花海 2023-09-08 14:23:59
例如我有一个数组$a = [1,2,3,4,5];由此$a,如何获取最后一个数组并将其设置为第一个[5,1,2,3,4] ,以及如何获取最后两个数组以使其像[4,5,1,2,3]
查看完整描述

4 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

您可以组合使用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]


查看完整回答
反对 回复 2023-09-08
?
杨魅力

TA贡献1811条经验 获得超5个赞

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),数组指针将被重置。换句话说,即使有一个大数组和多次旋转(我在代码中称之为“步骤”),它仍然保持高效。



查看完整回答
反对 回复 2023-09-08
?
SMILET

TA贡献1796条经验 获得超4个赞

不要迭代调用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 循环轮换解决方案)上的,我在评论中提供了这个片段。



查看完整回答
反对 回复 2023-09-08
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您实际上是在进行右旋转,而不是左旋转。无论如何,这里有执行这两个操作的函数。它们可能不是最有效的,但它们的代码很短并且非常不言自明:


<?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);

?>


查看完整回答
反对 回复 2023-09-08
  • 4 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信