Array shift: примеры (PHP)
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, а не к предупреждению, как в более ранних версиях.
Расширенные примеры применения
$taskQueue = ['задача1', 'задача2', 'задача3'];
while ($taskQueue) {
$currentTask = array_shift($taskQueue);
echo 'Выполняется: ' . $currentTask . '\n';
// Имитация выполнения...
}
echo 'Очередь пуста.';Выполняется: задача1 Выполняется: задача2 Выполняется: задача3 Очередь пуста.
$queue = [];
array_push($queue, 'A'); // Добавить в конец
array_push($queue, 'B');
$item = array_shift($queue); // Взять из начала
echo 'Обработан: ' . $item . '\n';
print_r($queue);Обработан: A
Array
(
[0] => B
)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
$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 нет, но можно сымитировать, выбрав первую строку с сортировкой и удалив её.