Лучший способ очистить значения массива PHP

172

Что является более эффективным для очистки всех значений в массиве? Первый потребовал бы, чтобы я использовал эту функцию каждый раз в цикле второго примера.

foreach ($array as $i => $value) {
    unset($array[$i]);
}

Или это

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
el_pup_le
источник
5
Что не так с unset($array)?
Блейк
13
удаляет переменную.
el_pup_le
2
Да, но почему вы хотите оценить нулевой массив, который вы установили таким образом?
Блейк
3
Источник? Ни одна переменная в памяти не выглядит так, как будто бы она была меньше, чем var - null.
Блейк

Ответы:

256

Как сказал Зак в комментариях ниже, вы можете просто восстановить его, используя

$foo = array(); // $foo is still here

Если вы хотите что-то более мощное, используйте unset, так как это также очистит $ foo из таблицы символов, если вам понадобится массив позже, просто создайте его еще раз.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Эрик Херлиц
источник
63
Почему бы просто не восстановить его как $foo = array();?
Зак Заткин-Голд
2
@NishamMahsin Либо используйте, global $foo; unset($foo);либоunset($GLOBALS['foo']);
Эрик Херлиц,
7
@vivoconunxino Я написал это так из-за вопроса авторов «Лучший способ очистить значения массива PHP». Это говорит «ясно», а не «новый экземпляр». Использование unsetочистит $fooтаблицу символов. Мы говорим об очень больших таблицах, которые я, вероятно, рекомендую, $foo = null; unset($foo);так как это также очистит память немного лучше. Это поведение (GC), однако, не очень постоянное и может изменяться в версиях PHP.
Эрик Херлиц,
5
unset () иногда очень плохо и может вызвать проблемы, если вы используете его неправильно. Он не отвечает на ОП правильно. Не знаю, почему он принял это как лучший ответ, его комментарий на его собственный вопрос говорит, что проблема с unset заключается в том, что он удаляет переменную. Чтобы увидеть, какие проблемы вызывает это решение, взгляните на мой ответ здесь .
Wolfsblvt
2
Для всех, кто поддерживает $foo = array();: на самом деле в этом может быть концептуальная проблема: повторное создание структуры - это не то же самое, что ее опустошение. Имея дело с памятью, вы знаете, что это не то же самое, что распределение медленное. Таким образом, несмотря на простоту использования, повторное создание экземпляра может не быть ответом на этот вопрос, особенно если нужно делать это много раз и быстро. Это может сработать, но это сильно зависит от управления памятью PHP, IMO.
TechNyquist
82

Если вы просто хотите сбросить переменную в пустой массив, вы можете просто переинициализировать ее:

$foo = array();

Обратите внимание, что это будет поддерживать любые ссылки на него:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

Если вы хотите разорвать любые ссылки на него, сначала удалите его:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged
mpen
источник
3
Я думаю, что это лучший ответ. Должны быть приняты. Он показывает самый простой способ, а также описывает, почему и когда unsetследует использовать. +1
Это мой код: justpaste.it/1gt46 . Как я могу объявить более одного идентификатора в переменной. Объявление одного значения: $ productId = 19; Как я могу объявить более чем одно значение в $ productId =?
Камень
@Rathinam Не уверен, что это имеет отношение к очистке массива. Пожалуйста, опубликуйте новый вопрос в Stackoverflow и вставьте свой код прямо в вопрос.
mpen
32

К сожалению, я не могу ответить на другие вопросы, у меня недостаточно репутации, но мне нужно указать на то, что было ОЧЕНЬ важно для меня, и я думаю, что это поможет и другим людям.

Сброс переменной является хорошим способом, если вам не нужна ссылка на исходный массив!

Чтобы было понятно, что я имею в виду: если у вас есть функция, которая использует ссылку на массив, например, функция сортировки, например

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);

    sort_my_list($temporary_list);

    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

это не работает! Будьте осторожны, unsetудаляет ссылку, чтобы переменная $arrayсоздавалась снова и корректно заполнялась, но значения недоступны извне функции.

Так что, если у вас есть ссылки, вы должны использовать $array = array()вместо unset, даже если это менее чисто и понятно.

Wolfsblvt
источник
3
это должен быть ответ - OP говорит, что значения массива должны быть чистыми, а не ссылаться на всю переменную массива.
Росс
13

Я бы сказал первый, если массив ассоциативный. Если нет, используйте forцикл:

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

Хотя, если возможно, используя

$array = array();

Сбросить массив в пустой массив предпочтительнее.

Призрак Мадары
источник
6

Как насчет $array_name = array();?

Бибхас Дебнатх
источник
5

Используйте array_spliceдля очистки массива и сохранения ссылки:

array_splice($myArray, 0);

Аллан Джардин
источник
2

Я использовал unset (), чтобы очистить массив, но я пришел к выводу, что unset () сделает массив пустым, следовательно, необходимо повторно объявить массив, как, например,

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>
благословение
источник
1

Я вижу, что эти вопросы действительно старые, но для этой проблемы я написал рекурсивную функцию для сброса всех значений в массиве. Рекурсивно, потому что возможно, что значения из данного массива также являются массивом. Так что это работает для меня:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

Таким образом, я получаю массив со всеми ключами и подмассивами, но с пустыми значениями.

Bueck0815
источник
1

Может быть, простой, экономичный способ (меньше признаков для использования) ...

$array = [];

Мы можем прочитать в руководстве по PHP:

Начиная с PHP 5.4 вы также можете использовать синтаксис короткого массива, который заменяет array () на [].

PHP php
источник
Вы должны также объяснить это.
Кульшрешт К
0

Функция unset полезна, когда сборщик мусора выполняет обход, не имея обеденного перерыва;

однако неустановленная функция просто уничтожает ссылку на переменную данных, данные все еще существуют в памяти, и PHP видит память как используемую, несмотря на то, что указатель на нее больше не существует.

Решение. Назначьте nullпеременные для очистки данных, по крайней мере, до тех пор, пока сборщик мусора не овладеет ими.

$var = null;

а затем сбросить его аналогичным образом!

unset($var);
Вакар Аламгир
источник
4
Это не звучит правильно. Я не думаю, что установка этого параметра nullвызовет немедленную сборку мусора. У вас есть ссылка на это?
mpen
@mpen Согласны ли вы с тем, что присвоение NULLзаменит значение, хранящееся в расположении $varпеременной в этом примере?
Энтони Ратледж
1
@AnthonyRutledge Нет, не знаю. Насколько я знаю, PHP просто обновится, $varчтобы указать на некоторый глобальный NULLобъект, и оставит $varданные в покое, пока они не будут собраны. Почему переводчик был вынужден немедленно перезаписать эти данные?
mpen
@mpen Это хороший вопрос, но в этом мире, по крайней мере, все готово для сбора.
Энтони Ратледж,
На самом деле. Дело в том, что я сомневаюсь, что установка его в null, прежде чем его
сбросить,
-1

Это мощный и проверенный unset ($ gradearray); // переустановить массив

Чарльз
источник
1
Чтобы ответить на вопрос, вы должны объяснить, какой путь лучше и почему
Фабиан