Циклический сдвиг массива - это одна из базовых операций при работе с массивами в программировании. Этот процесс заключается в том, чтобы сдвинуть элементы массива вправо или влево на определенное количество позиций, причем элементы, “выходящие” за границы массива, перемещаются на противоположную сторону. В PHP эту операцию можно выполнять несколькими способами, включая использование встроенных функций языка или написание собственной функции.
PHP предоставляет несколько встроенных функций для работы с массивами, которые могут быть использованы для циклического сдвига. Давайте рассмотрим наиболее распространенные из них: array_shift
, array_pop
, array_unshift
и array_push
.
array_shift
и array_push
:
$array = [1, 2, 3, 4, 5];
$shifted_element = array_shift($array); // Удаляем первый элемент массива и сохраняем его
array_push($array, $shifted_element); // Добавляем удаленный элемент в конец массива
print_r($array); // [2, 3, 4, 5, 1]
/*
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 5
[4] => 1
)
*/
array_pop
и array_unshift
:
$array = [1, 2, 3, 4, 5];
$popped_element = array_pop($array); // Удаляем последний элемент массива и сохраняем его
array_unshift($array, $popped_element); // Добавляем удаленный элемент в начало массива
print_r($array);
/*
Array
(
[0] => 5
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
*/
Эти функции позволяют циклически сдвигать массив на одну позицию вправо и влево соответственно.
Иногда требуется выполнить циклический сдвиг на определенное количество позиций. Для этого можно написать собственную функцию.
function cyclicRotate(array $arr, int $shift): array {
$size = count($arr);
$shift = $shift % $size; // Убеждаемся, что сдвиг не превышает размер массива
// Сдвигаем элементы массива на $shift позиций вправо
$sliced_array = array_slice($arr, -$shift);
$rotated_array = array_slice($arr, 0, $size - $shift);
return array_merge($sliced_array, $rotated_array);
}
$array = [1, 2, 3, 4, 5];
$shifted_array = cyclicRotate($array, 2);
print_r($shifted_array);
/*
Array
(
[0] => 4
[1] => 5
[2] => 1
[3] => 2
[4] => 3
)
*/
Эта функция принимает массив и количество позиций для сдвига. Она использует функции array_slice
и array_merge
, чтобы эффективно выполнить сдвиг на заданное количество позиций вправо.