Как исключить начальный элемент из массива с помощью PHP
Способы удаления первого элемента массива в PHP
При работе с массивами часто возникает необходимость убрать первый элемент. В PHP существует несколько методов, каждый из которых подходит для определённых задач. Рассмотрим основные варианты, их особенности и возможные проблемы.
Какой способ является наиболее эффективным для удаления первого элемента?
array_shift()
Функция array_shift($array) удаляет первый элемент массива и возвращает его значение. После удаления числовые ключи переиндексируются (начиная с 0), ассоциативные ключи сохраняются. Это самый простой и быстрый способ для большинства случаев.
$fruits = ['apple', 'banana', 'cherry'];
$first = array_shift($fruits);
// $first = 'apple'
// $fruits = ['banana', 'cherry']содержимое массива php (php вывод содержимого массива)
Возможные проблемы:
- Если массив пуст, возвращается
nullи генерируется предупреждениеE_WARNINGв PHP 8+. Рекомендуется проверять массив перед вызовом. - После
array_shift()сбрасывается внутренний указатель массива (например, если использовалсяeach()). - Для больших массивов переиндексация может быть затратной, но на практике разница незаметна.
Как удалить первый элемент, не изменяя исходный массив?
array_slice()
Функция array_slice($array, 1) возвращает новый массив, содержащий все элементы, начиная со второго. Исходный массив остаётся нетронутым. Это удобно, когда нужно сохранить оригинальные данные.
$colors = ['red', 'green', 'blue'];
$withoutFirst = array_slice($colors, 1);
// $withoutFirst = ['green', 'blue']
// $colors = ['red', 'green', 'blue']массив содержит php (php проверка наличия элемента в массиве)
Особенности:
- Числовые ключи в новом массиве будут переиндексированы (по умолчанию). Если нужно сохранить ключи, используйте третий параметр
true. - Для ассоциативных массивов ключи сохраняются автоматически.
Как удалить первый элемент и сохранить числовые ключи без сдвига?
unset() + array_values()
Вызов unset($array[0]) удаляет элемент с ключом 0, но остальные ключи не изменяются. Чтобы переиндексировать массив и сделать ключи последовательными, применяется array_values().
$numbers = [10, 20, 30];
unset($numbers[0]);
// $numbers = [1 => 20, 2 => 30]
$numbers = array_values($numbers);
// $numbers = [20, 30]
Php между значениями (выборка значений массива в диапазоне php)
Когда это полезно:
- Если массив не обязательно начинается с нулевого индекса, или нужно удалить элемент по конкретному ключу.
- Комбинация
unsetиarray_valuesможет быть менее производительной, чемarray_shift, но даёт гибкость.
Как удалить первый элемент ассоциативного массива, зная его ключ?
key() + unset()
Если массив ассоциативный и нужно удалить первый элемент (по порядку добавления), можно получить ключ первого элемента функцией array_key_first() (PHP 7.3+) или комбинацией reset() и key(), а затем удалить его через unset().
$user = ['name' => 'John', 'age' => 30, 'city' => 'NY'];
$firstKey = array_key_first($user); // 'name'
unset($user[$firstKey]);
// $user = ['age' => 30, 'city' => 'NY']Php есть ли значение в массиве (поиск значения в массиве php)
Важно:
array_key_first()работает только с PHP 7.3 и выше. Для старых версий используйтеreset($user); $firstKey = key($user); unset($user[$firstKey]);.- Внутренний указатель массива при этом сбрасывается.
Как удалить несколько первых элементов за один раз?
array_splice()
Функция array_splice() может удалять часть массива и заменять её другими элементами. Для удаления первого элемента укажите смещение 0 и длину 1. Можно удалить и больше.
$items = ['a', 'b', 'c', 'd'];
$removed = array_splice($items, 0, 1);
// $removed = ['a']
// $items = ['b', 'c', 'd']
Отличие от array_shift:
array_splice()возвращает удалённые элементы в виде массива, а не одно значение.- Позволяет одновременно удалить и вставить другие элементы.
- Числовые ключи переиндексируются.
Расширенные примеры и нестандартные ситуации
Пример 1. Удаление первого элемента в цикле (очередь FIFO)
Часто требуется обрабатывать массив как очередь, последовательно извлекая первые элементы. Использование array_shift() в цикле - простой способ, но нужно учитывать, что на каждой итерации массив переиндексируется, что может снижать производительность для больших массивов.
<?php
$queue = range(1, 100000);
$start = microtime(true);
while ($item = array_shift($queue)) {
// обработка $item
}
echo 'Время: ' . (microtime(true) - $start) . ' сек';
?>
Время: 0.045 сек (примерное значение)
Альтернатива:
Для больших массивов эффективнее использовать обратный цикл с array_pop() или итерацию с индексом, не удаляя элементы, а просто перебирая. Удаление первого элемента сдвигает все последующие, что затратно.
Пример 2. Удаление первого элемента из многомерного массива
Если массив вложенный, array_shift() работает так же, удаляя первый элемент верхнего уровня.
<?php
$matrix = [
['x', 'y'],
[1, 2],
[3, 4]
];
$firstRow = array_shift($matrix);
// $firstRow = ['x', 'y']
// $matrix = [[1, 2], [3, 4]]
?>
$firstRow: ['x', 'y'] $matrix: [[1, 2], [3, 4]]
Пример 3. Удаление первого элемента с сохранением ассоциативных ключей
Если массив ассоциативный, и требуется удалить элемент по порядку (не по ключу), array_shift() сохраняет остальные ключи.
<?php
$data = ['one' => 1, 'two' => 2, 'three' => 3];
$removed = array_shift($data);
// $removed = 1
// $data = ['two' => 2, 'three' => 3]
?>
$removed: 1 $data: ['two' => 2, 'three' => 3]
Пример 4. Использование array_slice для получения нового массива без первого элемента с сохранением ключей
<?php
$indexed = ['a' => 10, 'b' => 20, 'c' => 30];
$sliced = array_slice($indexed, 1, null, true);
// $sliced = ['b' => 20, 'c' => 30]
// Параметр true сохраняет ключи
?>
$sliced: ['b' => 20, 'c' => 30]
Пример 5. Удаление первого элемента с помощью array_splice и вставка нового элемента вместо него
<?php
$arr = ['first', 'second', 'third'];
$removed = array_splice($arr, 0, 1, ['new_first']);
// $removed = ['first']
// $arr = ['new_first', 'second', 'third']
?>
$removed: ['first'] $arr: ['new_first', 'second', 'third']
Пример 6. Обработка пустого массива и предотвращение ошибок
<?php
function safeShift(array &$array): mixed
{
if (empty($array)) {
return null;
}
return array_shift($array);
}
$empty = [];
$result = safeShift($empty); // null, без предупреждения
?>
$result: null
Пример 7. Сравнение производительности array_shift и array_slice для больших массивов
<?php
$size = 50000;
$arr1 = range(0, $size);
$arr2 = range(0, $size);
$start = microtime(true);
array_shift($arr1);
echo 'array_shift: ' . (microtime(true) - $start) . ' сек\n';
$start = microtime(true);
$arr2 = array_slice($arr2, 1);
echo 'array_slice: ' . (microtime(true) - $start) . ' сек\n';
?>
array_shift: 0.028 сек array_slice: 0.021 сек
Примечание:
Результаты могут варьироваться. array_slice обычно быстрее, так как не изменяет исходный массив, а создаёт копию нужной части. array_shift переиндексирует оставшиеся элементы, что может быть медленнее для больших массивов. Выбор зависит от необходимости модифицировать исходный массив.