在PHP中,是否可以轻松地“旋转”数组?
就像这样: 1、2、3、4 -> 2、3、4、1
是否有某种内置的PHP函数可以实现这个功能?
逻辑是交换元素。算法可能看起来像这样 -
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.
不是的。查看array_shift
及其相关函数的文档,以获取编写此类函数所需的一些工具。甚至在该页面的注释中可能已经实现了一个array_rotate
函数。
此外,值得阅读左侧边栏列出的数组函数,以全面了解PHP中可用的数组函数。
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));
}
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;
}
与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
等於 0
,4
和8
時,第二個if
區塊會參與互動 - 在這些情況下,輸入與期望的輸出相同,因此呼叫 array_merge()
和 array_splice()
是沒有意義的。