Способы избавления от всех элементов массива в PHP
Удаление всего массива в PHP
Работа с массивами в PHP часто требует не только добавления или изменения элементов, но и полного их удаления. Под удалением массива может пониматься как уничтожение самой переменной, так и очистка её содержимого с сохранением идентификатора. В зависимости от цели выбирается подходящий способ: от простого присваивания пустого массива до вызова специальных функций. В этом материале разберём основные варианты, их эффективность и подводные камни.
Как очистить массив, оставив переменную доступной?
Самый простой и быстрый способ - присвоить переменной пустой массив:
$array = [1, 2, 3];
$array = [];
var_dump($array); // array(0) {}Этот метод работает для любых типов массивов (числовых, ассоциативных, смешанных). После присваивания переменная остаётся определена как массив, но не содержит ни одного элемента.
Возможные проблемы:
- Если массив был связан с другими переменными по ссылке, новая ссылка на пустой массив не затронет старые ссылки - они останутся указывать на старый массив.
- Присваивание не сразу освобождает память - старый массив будет удалён сборщиком мусора позже, если на него нет других ссылок.
Как удалить переменную массива полностью?
При вызове unset() переменная перестаёт существовать, а память освобождается немедленно (при отсутствии других ссылок).
$array = ['a' => 1, 'b' => 2];
unset($array);
var_dump(isset($array)); // bool(false)После этого любое обращение к переменной вызовет ошибку Undefined variable. Использовать этот способ стоит, когда массив больше не нужен вовсе.
Типичная ошибка:
Попытка использовать unset внутри функции для очистки глобального массива без передачи по ссылке - удаляется только локальная копия. Нужно передавать переменную по ссылке или использовать $GLOBALS.
Как удалить все элементы, сохранив исходные ключи (для ассоциативных массивов)?
Функция array_splice() позволяет удалить диапазон элементов. Если передать ей массив, начальный индекс 0 и количество элементов, равное длине массива, все элементы будут удалены, а ключи (в том числе строковые) останутся нетронутыми.
$array = ['x' => 10, 'y' => 20, 'z' => 30];
array_splice($array, 0, count($array));
var_dump($array); // array(0) {}Этот подход полезен, когда нужно сбросить содержимое, но не трогать порядок ключей (например, для последующей вставки с сохранением старой схемы). Однако для числовых индексов array_splice переиндексирует их, начиная с 0.
Важно:
Если не указать третий аргумент (количество), будет удалён только первый элемент. Всегда нужно явно передавать count($array).
Как освободить память, занимаемую массивом, без удаления переменной?
Присваивание null освобождает память так же, как и unset, но переменная остаётся определённой со значением null. Это может быть полезно, если нужно явно указать, что массив пустой, но тип переменной не важен.
$array = [1, 2, 3];
$array = null;
var_dump($array); // NULLОднако после этого переменная перестаёт быть массивом, и дальнейшие попытки использовать её как массив (например, $array[] = 4) приведут к ошибке. Этот способ уместен только если в дальнейшем переменная не будет использоваться как массив.
Как очистить массив, переданный в функцию по ссылке?
Для того чтобы очистить внешний массив из функции, нужно объявить параметр со ссылкой (&) и присвоить ему пустой массив:
function clearArray(array &$arr) {
$arr = [];
}
$data = [1, 2, 3];
clearArray($data);
var_dump($data); // array(0) {}Если ссылку не использовать, изменения внутри функции не повлияют на оригинал.
Дополнительные примеры и нестандартные приёмы
1. Удаление массива через array_splice с отрицательным стартом
Можно удалить все элементы, указав отрицательную позицию, равную -count($array):
$array = [1, 2, 3, 4, 5];
array_splice($array, -count($array));
var_dump($array); // array(0) {}array(0) {}2. Очистка массива с использованием array_filter
Функция array_filter без коллбэка удаляет элементы, равные false. Чтобы удалить все, можно передать коллбэк, который всегда возвращает false:
$array = ['a' => 1, 'b' => 2];
$array = array_filter($array, function() { return false; });
var_dump($array); // array(0) {}array(0) {}Но этот способ медленнее прямого присваивания и не рекомендуется для обычной очистки.
3. Удаление всех элементов в цикле unset (неэффективно)
Циклическое удаление по одному элементу (например, через array_pop) крайне неэффективно для больших массивов:
$array = range(1, 10000);
$start = microtime(true);
while (count($array)) {
array_pop($array);
}
echo microtime(true) - $start; // значительно больше, чем при $array = []Такой подход увеличивает время выполнения на несколько порядков.
4. Использование array_replace для очистки
Передавая пустой массив в array_replace, можно сбросить все ключи:
$array = ['x' => 10, 'y' => 20];
$array = array_replace([], $array); // не очищает, а копирует
$array = array_replace($array, []); // очищает?
// На самом деле array_replace не удаляет элементы из первого массива, а заменяет их. Чтобы очистить, нужно передать пустой массив первым и старый вторым:
$array = ['x' => 10];
$array = array_replace([], $array); // в $array останутся ключи из второго массива? Нет, array_replace возвращает новый массив, где все ключи из второго, но значения из первого, если ключи совпадают. Результат: ['x' => NULL]? Неверно.
// Правильная очистка через array_replace не очевидна. Лучше избегать.Для ассоциативных массивов можно использовать array_diff_key с самим собой:
$array = ['a' => 1];
$array = array_diff_key($array, $array);
var_dump($array); // array(0) {}array(0) {}Этот трюк возвращает пустой массив, удаляя все ключи.
5. Сброс всех ключей при очистке числового массива
Если нужно после очистки получить числовой массив с нулевым индексом, лучше сразу присвоить []. Если же требуется сохранить структуру ключей, но для числовых массивов это не имеет смысла - они и так будут переиндексированы после любых операций.
6. Очистка многомерного массива (рекурсивно)
Для вложенных массивов обычное присваивание [] очищает только верхний уровень. Чтобы рекурсивно очистить все подмассивы, необходимо использовать рекурсию:
function clearNested(&$arr) {
foreach ($arr as &$val) {
if (is_array($val)) {
clearNested($val);
}
}
$arr = [];
}
$nested = ['a' => ['b' => 2], 'c' => 3];
clearNested($nested);
var_dump($nested); // array(0) {}array(0) {}Этот метод меняет исходный массив по ссылке.
7. Очистка массива с сохранением только числовых ключей
Если массив имеет смешанные ключи, а нужно удалить все строковые ключи, можно использовать array_values после очистки. Но проще сразу создать новый пустой массив.