Чтобы удалить элемент из массива 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 не нужно.