Menu

Удалить элемент из массива PHP: unset, array_splice

unset($array[$key]) удаляет элемент по ключу, array_splice удаляет по позиции и перенумеровывает, а array_diff удаляет по значению. Каждый способ, перенумерация после удаления и ловушка с array_search, из-за которой удаляется не тот элемент.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Чтобы удалить элемент из массива PHP по ключу, используйте unset($array[$key]). Элемент исчезает, остальные ключи остаются ровно такими, как были, а удаление несуществующего ключа не ошибка.

Посмотрите на второй результат: теперь ключи 0, 2, 3. unset никогда не перенумеровывает.

Перенумерация массива после unset

Список с пропуском в ключах потом создаёт проблемы: цикл for ($i = 0; ...) натыкается на отсутствующий индекс, а json_encode записывает JSON-объект вместо массива. array_values() возвращает чистые ключи.

Удаление по позиции через array_splice

array_splice($array, $offset, $length) удаляет $length элементов начиная с позиции $offset, перенумеровывает ключи и возвращает удалённое. Отрицательное смещение отсчитывается с конца. В том же вызове можно вставить элементы на замену.

array_splice работает с позициями, а не с ключами: в ассоциативном массиве она удаляет по месту в порядке элементов и сохраняет строковые ключи. На странице array_slice она сравнивается с array_slice, которая копирует часть, не меняя оригинал.

Удаление элемента по значению

array_diff($array, [$value]) возвращает массив без всех элементов, равных $value, сохраняя ключи остальных. Чтобы удалить только первое совпадение, найдите его ключ через array_search и удалите.

array_diff сравнивает значения как строки, поэтому array_diff([1, "1", 2], [1]) удаляет и целое число, и строку. Когда условие сложнее, чем "равно этому значению", используйте array_filter с колбэком.

Удаление первого или последнего элемента

array_shift() удаляет первый элемент, а array_pop() последний. Обе возвращают удалённый элемент, что удобно для очередей и стеков.

array_shift перенумеровывает числовые ключи с 0. array_pop это не нужно, потому что пропуск оказывается в конце.

Удаление нескольких ключей сразу

unset принимает несколько элементов за один вызов. Чтобы удалить список ключей, который лежит в массиве, переверните его через array_flip(), чтобы имена стали ключами, и передайте в array_diff_key().

Частая ошибка: unset с array_search, когда значения нет

array_search возвращает false, когда ничего не нашла, а false в качестве ключа массива становится 0. Поэтому эта строка удаляет первый элемент всякий раз, когда значения в массиве нет:

Всегда сохраняйте результат array_search и сравнивайте его через !== false, прежде чем использовать как ключ. Простого if ($key) тоже недостаточно: совпадение с индексом 0 тоже ложно.

Часто задаваемые вопросы

Как удалить элемент массива по значению в PHP?

Чтобы удалить все вхождения, используйте array_diff($arr, ['value']). Чтобы удалить только первое, найдите его ключ и удалите, проверив, что он найден: $k = array_search('value', $arr); if ($k !== false) { unset($arr[$k]); }.

Как перенумеровать массив после unset?

Оберните его в array_values(): $arr = array_values($arr); перенумеровывает ключи с 0. Или удаляйте элемент через array_splice($arr, $index, 1), которая перенумерует сама.

Как удалить первый или последний элемент массива?

array_shift($arr) удаляет и возвращает первый элемент и перенумеровывает числовые ключи. array_pop($arr) удаляет и возвращает последний элемент.

Можно ли удалять элемент внутри цикла foreach?

Да. foreach ($arr as $k => $v) { if ($v < 0) { unset($arr[$k]); } } безопасен, потому что foreach проходит копию массива, пока вы меняете оригинал. В ключах остаются пропуски, поэтому вызовите потом array_values(), если нужен список.

Вызывает ли unset для отсутствующего ключа ошибку?

Нет. unset($arr['missing']) ничего не делает и не выдаёт предупреждения, поэтому проверять заранее через isset не нужно.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ