Array shift: примеры (PHP)

Работа с array_shift: извлечение элемента из начала массива
Раздел: Работа с массивами
array_shift(array &$array): mixed

Функция array_shift в PHP

Функция array_shift извлекает и возвращает первый элемент массива, сокращая размер массива на один элемент. Все числовые ключи переиндексируются, начиная с нуля, а строковые ключи остаются без изменений. Эта функция часто применяется для обработки очередей (реализации структуры данных FIFO), работы с данными, полученными из внешних источников, или пошагового извлечения элементов для обработки.

Аргументы функции

Функция принимает всего один обязательный параметр:

  • &$array (передача по ссылке) — исходный массив, из которого будет извлечен первый элемент. После выполнения функции переданный массив будет изменен.

Примеры использования array_shift

Базовый пример работы с числовыми ключами
$queue = ['Первый', 'Второй', 'Третий'];
$firstElement = array_shift($queue);
print_r($queue);
Array
(
    [0] => Второй
    [1] => Третий
)

Извлеченный элемент: $firstElement = 'Первый'

Работа с массивом, где есть строковые ключи
$assocArray = ['name' => 'Иван', 'age' => 30, 10 => 'десять'];
$value = array_shift($assocArray);
print_r($assocArray);
Array
(
    [age] => 30
    [0] => десять
)

Строковой ключ 'name' удален, а числовой ключ 10 переиндексирован в 0. Извлеченное значение: 'Иван'.

Попытка извлечь элемент из пустого массива
$emptyArray = [];
$result = array_shift($emptyArray);
var_dump($result);
print_r($emptyArray);
NULL
Array
(
)

Похожие функции в PHP

В PHP существует несколько функций для извлечения элементов с разных концов массива:

  • array_pop(&$array) — извлекает и возвращает последний элемент массива. Не переиндексирует числовые ключи, просто удаляет последнюю пару ключ-значение. Удобна для реализации стека (LIFO).
  • reset(&$array) — сбрасывает внутренний указатель массива на первый элемент и возвращает его значение, но не удаляет элемент из массива. Полезна для получения первого элемента без модификации массива.
  • current($array) — возвращает текущий элемент массива (на который указывает внутренний указатель). Часто используется в паре с next(), prev() для итерации.

array_shift предпочтительнее использовать, когда важен порядок обработки элементов (очередь), а array_pop — когда порядок не важен или нужна работа по принципу стека.

Типичные ошибки при использовании array_shift

Передача переменной, не являющейся массивом

В PHP 8 это вызовет фатальную ошибку TypeError.

$notArray = 'строка';
// $result = array_shift($notArray); // TypeError
Непонимание переиндексации

Часто забывают, что функция переиндексирует числовые ключи, что может нарушить логику работы, если структура данных на это не рассчитана.

$data = [2 => 'a', 5 => 'b'];
array_shift($data);
print_r($data);
Array
(
    [0] => b  // Ключ изменился с 5 на 0
)
Использование с массивами, где важен порядок строковых ключей

Поведение для массивов со смешанными ключами может быть неочевидным.

Изменения в последних версиях PHP

В PHP 7.3, 7.4 и 8.0 поведение функции array_shift оставалось стабильным и не претерпевало значительных изменений. Основное изменение связано с общей типизацией в PHP 8: теперь функция ожидает единственный аргумент типа array. Попытка передать не массив приводит к TypeError, а не к предупреждению, как в более ранних версиях.

Расширенные примеры применения

Обработка очереди задач
Пример php
$taskQueue = ['задача1', 'задача2', 'задача3'];
while ($taskQueue) {
    $currentTask = array_shift($taskQueue);
    echo 'Выполняется: ' . $currentTask . '\n';
    // Имитация выполнения...
}
echo 'Очередь пуста.';
Выполняется: задача1
Выполняется: задача2
Выполняется: задача3
Очередь пуста.
Комбинация с array_push для реализации очереди
Пример php
$queue = [];
array_push($queue, 'A'); // Добавить в конец
array_push($queue, 'B');
$item = array_shift($queue); // Взять из начала
echo 'Обработан: ' . $item . '\n';
print_r($queue);
Обработан: A
Array
(
    [0] => B
)
Использование в рекурсивной функции для обработки вложенных структур
Пример php
function processNestedArray(&$arr) {
    if (empty($arr)) return;
    $first = array_shift($arr);
    if (is_array($first)) {
        processNestedArray($first);
    } else {
        echo 'Элемент: ' . $first . '\n';
    }
    processNestedArray($arr); // Обрабатываем оставшееся
}
$data = [1, [2, 3], 4];
processNestedArray($data);
Элемент: 1
Элемент: 2
Элемент: 3
Элемент: 4
Извлечение нескольких элементов по очереди с условием
Пример php
$messages = ['info: старт', 'warning: что-то пошло не так', 'info: конец'];
while (!empty($messages) && strpos($messages[0], 'info:') === 0) {
    $infoMsg = array_shift($messages);
    echo 'Инфо: ' . substr($infoMsg, 6) . '\n';
}
echo 'Оставшиеся сообщения:\n';
print_r($messages);
Инфо: старт
Оставшиеся сообщения:
Array
(
    [0] => warning: что-то пошло не так
    [1] => info: конец
)

Аналоги функции в других языках

Array shift в Javascript

Метод Array.prototype.shift() работает аналогично: удаляет первый элемент и возвращает его, сдвигая индексы остальных.

let arr = [1, 2, 3];
let first = arr.shift();
console.log(first, arr);
1 [2, 3]

Array shift в Python

Метод list.pop(0) для списков или collections.deque.popleft(). Последний гораздо эффективнее для больших списков, так как pop(0) имеет сложность O(n).

from collections import deque
my_list = [1, 2, 3]
first = my_list.pop(0)  # Неэффективно для больших списков
print(first, my_list)

my_deque = deque([1, 2, 3])
first = my_deque.popleft()  # Эффективно O(1)
print(first, my_deque)
1 [2, 3]
1 deque([2, 3])

Array shift в MySQL

Прямого аналога в SQL нет, но можно сымитировать, выбрав первую строку с сортировкой и удалив её.

PHP array_shift function comments

En
Array shift Shift an element off the beginning of array