将数组元素向左旋转(将第一个元素移动到最后并重新索引)

26

在PHP中,是否可以轻松地“旋转”数组?

就像这样: 1、2、3、4 -> 2、3、4、1

是否有某种内置的PHP函数可以实现这个功能?


请点击此处以查看如何向右旋转而非向左旋转。 - mickmackusa
15个回答

0

逻辑是交换元素。算法可能看起来像这样 -

 for i = 0 to arrayLength - 1
    swap( array[i], array[i+1] )     // Now array[i] has array[i+1] value and 
                                     // array[i+1] has array[i] value.

@Dylan - 如果你想为自己编写一个,可以实现上述逻辑。 - Mahesh

0

不是的。查看array_shift及其相关函数的文档,以获取编写此类函数所需的一些工具。甚至在该页面的注释中可能已经实现了一个array_rotate函数。

此外,值得阅读左侧边栏列出的数组函数,以全面了解PHP中可用的数组函数。


0
以下是一个将数组(从零开始的数组)旋转到任何想要的位置的函数:
function rotateArray($inputArray, $rotateIndex) {
  if(isset($inputArray[$rotateIndex])) {
    $startSlice = array_slice($inputArray, 0, $rotateIndex);
    $endSlice = array_slice($inputArray, $rotateIndex);
    return array_merge($endSlice, $startSlice);
  }
  return $inputArray;
}

$testArray = [1,2,3,4,5,6];
$testRotates = [3, 5, 0, 101, -5];

foreach($testRotates as $rotateIndex) {
  print_r(rotateArray($testArray, $rotateIndex));
}

0
这是核心解决方案:(即使 shiftBy 大于数组长度也进行移位)
function rotate($array, $shiftBy)
{
    $res = [];
    $c   = count($array);
    for ($i = 0; $i < $c; $i++) {
        $n       = ($i + $shiftBy) % $c; // mod will take care of positions if rotates
        $res[$n] = $array[$i];
    }
    ksort($res);

    return $res;
}

烧掉这个,你就会明白。

-1

与ShaunCockerill答案中的第一个片段相似,我也赞成不要进行迭代函数调用来执行旋转。事实上,我建议使用提前的return来优化性能并减少需要的总函数调用次数。

以下片段是“向左移动”版本的“向右移动”版本,我在这里发布。在我的演示中,有一个单一的静态输入数组,foreach()循环仅改变所需的旋转量(0到9)。

代码:(演示

function shiftPop(array $indexedArray, int $shiftPopsCount): array
{
    $count = count($indexedArray);
    if ($count < 2) {
        return $indexedArray;
    }
    $remainder = $shiftPopsCount % $count;
    if (!$remainder) {
        return $indexedArray;
    }
    return array_merge(
        array_splice($indexedArray, $remainder),
        $indexedArray
    );
}

$array = [1, 2, 3, 4];
foreach (range(0, 9) as $moves) {
    var_export(shiftPop($array, $moves));
    echo "\n---\n";
}

我的片段中第一個 if 區塊並未因為我的陣列始終擁有4個元素而參與互動。當$moves 等於 048時,第二個if 區塊會參與互動 - 在這些情況下,輸入與期望的輸出相同,因此呼叫 array_merge()array_splice() 是沒有意義的。


所以这个答案因为在页面上展示和解释了时间复杂度最低的方法而被dv'ed?当然,在一个知识分享网站上这是有道理的。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接