Способы избавления от всех элементов массива в PHP

Раздел: 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 после очистки. Но проще сразу создать новый пустой массив.

Удаление всего массива в PHP - comments

En
Php удалить массива (php)