it-swarm.com.ru

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

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

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

Или это

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

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

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

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

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
213
Eric Herlitz

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

$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
75
mpen

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

Отключение переменной - это хороший способ, если вам не нужна ссылка на исходный массив!

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

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

30
Wolfsblvt

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

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

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

$array = array();

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

12
Madara Uchiha

Не достаточно unset() достаточно?

unset($array);
9
John Conde

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

6
Bibhas Debnath

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

array_splice($myArray, 0);

4
Allan Jardine

я использовал 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
Blessing

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

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

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

$var = null;

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

unset($var);
0
Waqar Alamgir

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

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;

}

Итак, с этим я получаю массив со всеми ключами и вложенными массивами, но с пустыми значениями.

0
Bueck0815