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]
TA贡献1811条经验 获得超6个赞
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
),数组指针将被重置。换句话说,即使有一个大数组和多次旋转(我在代码中称之为“步骤”),它仍然保持高效。
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 循环轮换解决方案)上的,我在评论中提供了这个片段。
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);
?>
- 4 回答
- 0 关注
- 112 浏览
添加回答
举报