Найкращий спосіб очистити значення масиву 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 is null.
Блейк

Відповіді:


256

Як сказав Зак у коментарях нижче, ви можете просто відновити його за допомогою

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

Якщо ви хочете, щоб щось потужніше не було використано, оскільки воно також очистить $ 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 () іноді дуже поганий і може спричинити неприємності, якщо ви неправильно використовуєте. Це не відповідає відповіді ОП правильно. Не знаю, чому він прийняв це як найкращу відповідь, його коментар до власного питання говорить про проблему з невстановленням, це те, що вона видаляє змінну. Щоб побачити, які проблеми викликають це рішення, погляньте на мою відповідь тут .
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 =?
Gem

@Rathinam Не впевнений, що це стосується очищення масиву. Будь ласка, опублікуйте нове запитання на Stackoverflow та вставте свій код прямо у питання.
квітня

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
це має бути відповіддю - ОП говорить чіткі значення масивів, а не де-посилання на всю змінну масиву.
Росс

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 ви також можете використовувати синтаксис короткого масиву, який замінює масив () на [].


Ви також повинні пояснити це.
Kulshreshth K

0

Функція скидання корисна, коли сміттєзбірник виконує свої обходи, не маючи перерви на обід;

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

Рішення. Призначте nullсвоїм змінним, щоб очистити дані, принаймні, поки збирач сміття не захопить їх.

$var = null;

а потім зніміть його аналогічним чином!

unset($var);

4
Це не звучить правильно. Я не думаю, що його встановлення nullпризведе до негайного вивезення сміття. У вас є посилання на це?
mpen

@mpen Чи погоджуєтесь ви, що присвоєння NULLзамінить значення, збережене у розташуванні $varзмінної у цьому прикладі?
Ентоні Рутлідж

1
@AnthonyRutledge Ні, я ні. Наскільки я знаю, PHP просто оновиться, $varщоб вказати на якийсь глобальний NULLоб'єкт і залишить $varдані в спокої, поки не буде зібрано сміття. Чому перекладач був би змушений негайно перезаписати ці дані?
mpen

@mpen Це гарне запитання, але в цьому світі хоча б все готово зібрати.
Ентоні Рутлідж

Справді. Точка, що я сумніваюся , встановивши його на нуль , перш ніж він буде його відключення допоможе будь-якому
mpen

-1

Це потужний і перевірений невстановлений ($ gradearray); // повторно встановити масив


1
Щоб відповісти на запитання, слід пояснити, який найкращий спосіб і чому
Фабіан Горлахер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.