array_splice()
Как использовать array_splice в PHP для удаления, замены и вставки элементов array, с примерами и описанием параметров.
Работа с массивами — неотъемлемая часть программирования, и PHP предоставляет ряд встроенных функций для работы с массивами. Одна из наиболее гибких — array_splice: единственная функция, которая умеет удалять, заменять и вставлять элементы в любой позиции. В отличие от array_slice(), которая копирует фрагмент array, не изменяя оригинал, array_splice модифицирует array на месте и возвращает удалённые элементы.
На этой странице описана сигнатура функции, поведение каждого параметра (включая часто вызывающие вопросы отрицательные смещения и перенумерацию ключей), а также приведены примеры для трёх основных сценариев использования: удаления, замены и вставки.
Что такое функция array_splice?
array_splice — это встроенная функция PHP, которая позволяет удалять или заменять элементы array и добавлять новые элементы на их место. Функция изменяет исходный array и возвращает удалённые элементы (если таковые имеются). Функция принимает три обязательных параметра и два необязательных:
Синтаксис функции PHP array_splice
array_splice(array &$input, int $offset, ?int $length = null, mixed $replacement = [])$input: входной array, который будет изменён$offset: индекс, с которого начинается операция$length(необязательный): количество удаляемых элементов. Если не указан, будут удалены все элементы от$offsetдо конца array$replacement(необязательный): элементы, которые будут вставлены вместо удалённых. Если не указан, новые элементы не вставляются
Как работает функция array_splice?
Функция array_splice оперирует входным array: начиная с указанного смещения, удаляет заданное количество элементов. Если длина не указана, удаляются все элементы от смещения до конца array. Удалённые элементы возвращаются в виде array.
Если указан параметр $replacement, функция вставляет элементы замены на место удалённых. Элементы замены могут быть любого типа данных, в том числе массивами. Если параметр $replacement не указан, новые элементы не вставляются, и функция просто удаляет указанные элементы.
Функция изменяет входной array на месте, то есть исходный array изменяется в результате операции. Поскольку первый параметр передаётся по ссылке (&$input), необходимо передавать переменную — нельзя применять array_splice непосредственно к литеральному array или результату вызова другой функции.
Отрицательное смещение и длина
Оба параметра — $offset и $length — принимают отрицательные значения, которые отсчитываются с конца array:
- Отрицательный
$offsetначинает операцию с соответствующего числа элементов от конца.array_splice($arr, -2)удаляет два последних элемента. - Отрицательный
$lengthостанавливает удаление за столько элементов до конца array, сколько указано, оставляя их нетронутыми.array_splice($arr, 1, -1)удаляет всё, кроме первого и последнего элемента.
Как затрагиваются ключи
array_splice предназначена для последовательных (списочных) массивов. После операции числовые ключи всегда перенумеруются с 0, тогда как строковые ключи сохраняются. Если необходимо сохранить числовые ключи неизменными, array_splice не подходит — используйте array_slice() с флагом preserve_keys.
Примеры
Удаление элементов из array
Допустим, у нас есть array чисел, и нам нужно удалить первые три элемента. Для этого можно использовать функцию array_splice следующим образом:
PHP: удаление элементов из array с помощью array_splice
В этом примере array $numbers будет изменён, и первые три элемента будут удалены. Удалённые элементы будут возвращены в переменную $removed. После вызова функции значение $numbers станет [4, 5, 6], а значение $removed — [1, 2, 3].
Замена элементов в array
Допустим, у нас есть array имён, и нам нужно заменить третье и четвёртое имена новыми. Для этого можно использовать функцию array_splice следующим образом:
PHP: замена элементов в array с помощью array_splice
В этом примере array $names будет изменён, и третье и четвёртое имена будут заменены именами 'Alex' и 'Olivia'. После вызова функции значение $names станет ['John', 'Mary', 'Alex', 'Olivia', 'Sarah']. Обратите внимание, что количество элементов замены не обязано совпадать с количеством удалённых — можно заменить два элемента пятью или вовсе без замены.
Вставка элементов в array
Допустим, у нас есть array букв, и нам нужно вставить буквы 'B' и 'C' в начало array. Для этого можно использовать функцию array_splice следующим образом:
PHP: вставка элементов в array с помощью array_splice
В этом примере array $letters будет изменён, и буквы 'B' и 'C' будут вставлены в начало array. После вызова функции значение $letters станет ['B', 'C', 'D', 'E', 'F'].
Использование отрицательного смещения и длины
В этом примере с помощью положительного смещения и отрицательной длины удаляется всё между первым и последним элементом:
PHP: array_splice с отрицательной длиной
<?php
$items = ['first', 'a', 'b', 'c', 'last'];
$removed = array_splice($items, 1, -1);
print_r($items); // ['first', 'last']
print_r($removed); // ['a', 'b', 'c']
?>Здесь $offset равен 1 (начало после 'first'), а $length равен -1 (остановить за один элемент до конца, сохранив 'last'), поэтому три средних элемента удаляются и возвращаются.
Связанные функции
array_splice перекрывается с несколькими более узкоспециализированными функциями array. Выбирайте наиболее подходящую — это делает намерение кода очевиднее:
array_slice()— извлечение фрагмента без изменения исходного array.array_merge()— объединение массивов по порядку, а не в заданной позиции.array_push()/array_unshift()— добавление элементов в конец или начало.array_pop()/array_shift()— удаление одного элемента с конца или с начала.
Заключение
array_splice — универсальный инструмент редактирования массивов в PHP: один вызов может удалять, заменять или вставлять элементы в любой позиции. Запомните несколько ключевых моментов:
- Функция изменяет входной array и возвращает удалённые элементы.
- Количество элементов замены не зависит от количества удалённых.
- Числовые ключи перенумеруются; строковые ключи сохраняются.
- Отрицательные
$offsetи$lengthотсчитываются с конца array.
Если нужно только прочитать фрагмент без изменения источника, предпочтительнее array_slice().