Функция array_shift в PHP
Функция array_shift в PHP удаляет первый элемент массива и возвращает его значение. Узнайте о синтаксисе, переиндексации и типичных ошибках.
Функция array_shift в PHP удаляет первый элемент из массива и возвращает его значение. Поскольку она всегда работает с началом массива, это естественный инструмент для последовательной обработки списка — выполнение очереди задач, удаление строки заголовка или лишнего первого элемента.
array_shift отличается от простого удаления $array[0] двумя важными особенностями:
- Она изменяет исходный массив на месте (передаётся по ссылке) — новый массив не создаётся.
- Она переиндексирует числовые ключи, поэтому оставшиеся элементы всегда начинаются с
0. Строковые ключи остаются неизменными.
На этой странице рассматривается синтаксис, возвращаемое значение, поведение при переиндексации, распространённая ловушка в циклах и несколько рабочих примеров.
Синтаксис
array_shift(array &$array): mixed| Часть | Описание |
|---|---|
&$array | Массив, из которого производится сдвиг. Передаётся по ссылке, поэтому изменяется напрямую. |
| возвращаемое значение | Значение удалённого первого элемента или null, если массив пуст. |
Поскольку массив передаётся по ссылке, array_shift($colors) вызывается для переменной — не для литерала или результата функции.
Удаление первого элемента
Наиболее распространённое использование — удаление первого элемента. Функция изменяет массив напрямую:
Результат будет следующим:
Array
(
[0] => green
[1] => blue
)Сохранение удалённого значения
array_shift возвращает удалённый элемент, поэтому можно сохранить его и одновременно уменьшить массив в одном выражении:
Результат будет следующим:
red
Array
(
[0] => green
[1] => blue
)Переиндексация ключей
Это поведение чаще всего удивляет разработчиков. array_shift не просто удаляет $array[0] — она перенумеровывает все оставшиеся целочисленные ключи начиная с 0. Строковые ключи сохраняют свои имена.
<?php
$data = [5 => "a", 10 => "b", "x" => "c"];
array_shift($data); // removes "a"
print_r($data);
?>Результат будет следующим:
Array
(
[0] => b
[x] => c
)Обратите внимание: 10 => "b" стало 0 => "b", тогда как "x" => "c" осталось без изменений. Если необходимо сохранить исходные числовые ключи, используйте вместо этого array_slice.
Обработка массива как очереди
Распространённый паттерн — последовательная обработка элементов массива с начала, по одному за раз. Стандартный подход использует array_shift внутри цикла while:
Результат будет следующим:
Running: build
Running: test
Running: deployЦикл завершается, потому что array_shift возвращает null, когда массив становится пустым.
Ловушка: не используйте проверку на истинность в цикле
Часто встречается такая сокращённая форма:
while ($value = array_shift($queue)) { ... }Для строк вроде "build" это работает, но это ловушка. Условие истинно только пока значение является истинным, поэтому цикл прервётся досрочно на первом встреченном 0, "", "0", false или null:
<?php
$numbers = array(3, 0, 1);
while ($n = array_shift($numbers)) {
echo "$n\n";
}
print_r($numbers); // 1 was never processed
?>Результат будет следующим:
3
Array
(
[0] => 1
)Цикл завершился на 0, оставив 1 необработанным. Всегда сравнивайте явно с null (!== null), если значения могут быть ложными.
Удаление нескольких первых элементов
Последовательные вызовы array_shift удаляют элементы с начала массива. Здесь мы удаляем первые три:
Результат будет следующим:
Array
(
[0] => yellow
[1] => orange
)Чтобы удалить несколько элементов с начала за один вызов вместо цикла, используйте array_splice($colors, 0, 3).
Связанные функции
array_shift — одна из четырёх функций для добавления и удаления элементов на концах массива:
| Функция | Действует на | Что делает |
|---|---|---|
| array_shift | Начало | Удаляет и возвращает первый элемент |
| array_unshift | Начало | Добавляет один или несколько элементов в начало |
| array_pop | Конец | Удаляет и возвращает последний элемент |
| array_push | Конец | Добавляет один или несколько элементов в конец |
Для получения среза без изменения исходного массива см. array_slice; для удаления или замены диапазона элементов см. array_splice.
Заключение
array_shift удаляет первый элемент массива, возвращает его значение, изменяет массив на месте и переиндексирует оставшиеся целочисленные ключи начиная с 0. Функция идеально подходит для обработки массива как очереди и удаления нежелательных первых элементов — только не забывайте о поведении переиндексации и ловушке с ложными значениями в цикле, рассмотренных выше.