Как полностью очистить массив php

Как полностью очистить массив php

// Before php 5.4
$array = array(1,2,3);

// since php 5.4 , short syntax
$array = [1,2,3];

// I recommend using the short syntax if you have php version >= 5.4

Used to creating arrays like this in Perl?

Looks like we need the range() function in PHP:

$array = array_merge (array( ‘All’ ), range ( ‘A’ , ‘Z’ ));
?>

You don’t need to array_merge if it’s just one range:

There is another kind of array (php>= 5.3.0) produced by

$array = new SplFixedArray(5);

Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.

Supposing a large string-keyed array

$arr=[‘string1’=>$data1, ‘string2’=>$data2 etc. ]

when getting the keyed data with

php does *not* have to search through the array comparing each key string to the given key (‘string1’) one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it’s all hidden away.

However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :

Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It’s also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).

When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
Example:

$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => 23 ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=0, is_ref=0)int 23

but :
$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => ’23’ ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=1, is_ref=0)string ’23’ (length=2)
or :

$arr = [‘bebe’ => ‘Bob’, ‘age’ => [1,2], ‘too’ => [1,2] ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2
‘too’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2

This function makes (assoc.) array creation much easier:

function arr (. $array )< return $array ; >
?>

It allows for short syntax like:

$arr = arr ( x : 1 , y : 2 , z : 3 );
?>

Instead of:

$arr = [ «x» => 1 , «y» => 2 , «z» => 3 ];
// or
$arr2 = array( «x» => 1 , «y» => 2 , «z» => 3 );
?>

Sadly PHP 8.2 doesn’t support this named arguments in the «array» function/language construct.

Источник

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

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

foreach ($array as $i => $value)

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

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

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

unset($foo); // $foo is gone $foo = array(); // $foo is here again с unset($foo); // $foo is gone $foo = array(); // $foo is here again 

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

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

$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 с $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 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// делай то, что хочешь здесь

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

Источник

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

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

foreach ($array as $i => $value)

10 ответов

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

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

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

@NishamMahsin Либо используйте global $foo; unset($foo); с global $foo; unset($foo); или не unset($GLOBALS[‘foo’]);

Downvoted: почему вы должны использовать unset ()? Есть ли проблема в использовании просто «$ foo = array ();» без сброса? ЗАЧЕМ?

@vivoconunxino Я написал это так из-за вопроса авторов «Лучший способ очистить значения массива PHP». Это «ясно», а не «новый экземпляр». Использование unset очистит $foo от таблицы символов. Если мы говорим об очень больших таблицах, я бы порекомендовал $foo = null; unset($foo); с $foo = null; unset($foo); так как это также очистило бы память немного лучше. Это поведение (GC), однако, не очень постоянное и может изменяться в версиях PHP.

Так что с точки зрения использования памяти это лучше, чем другие варианты . ммм хорошо! Благодарю за ваш ответ

@vivoconunxino Это так, но это также занимает немного больше времени. Проанализируйте и внедрите, как всегда

unset () иногда очень плох и может вызвать проблемы, если вы используете его неправильно. Он не отвечает на ОП правильно ответ. Не знаю, почему он принял это как лучший ответ, его комментарий к его собственному вопросу говорит, что проблема с unset заключается в том, что он удаляет переменную. Чтобы увидеть, какие проблемы вызывает это решение, взгляните на мой ответ здесь .

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

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

$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 

Я думаю, что это лучший ответ. Должны быть приняты. Он показывает самый простой способ, а также описывает, почему и когда следует использовать unset . +1

Это мой код: justpaste.it/1gt46 . Как я могу объявить более одного идентификатора в переменной. Объявление одного значения: $ productId = 19; Как я могу объявить более чем одно значение в $ productId =?

@Rathinam Не уверен, что это имеет отношение к очистке массива. Пожалуйста, опубликуйте новый вопрос в Stackoverflow и вставьте свой код прямо в вопрос.

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

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

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

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

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

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

В reset предпочтительнее использовать массив в пустом массиве.

Источник

Читайте также:  Programming text editor python
Оцените статью