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


172

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

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

Или это

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

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

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, даже если это менее чисто и понятно.


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

13

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

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

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

$array = array();

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





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;

}

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


1

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

$array = [];

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

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


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

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
Чтобы ответить на вопрос, вы должны объяснить, какой путь лучше и почему
Фабиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.