清除数组中的所有值哪个更有效?第一个要求我在第二个示例的循环中每次使用该函数。
foreach ($array as $i => $value) {
unset($array[$i]);
}
或这个
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
清除数组中的所有值哪个更有效?第一个要求我在第二个示例的循环中每次使用该函数。
foreach ($array as $i => $value) {
unset($array[$i]);
}
或这个
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
Answers:
就像Zack在下面的评论中说的那样,您只需使用即可重新实例化它
$foo = array(); // $foo is still here
如果您想要更强大的功能,请使用unset,因为它还会从符号表中清除$ foo,如果以后需要该数组,只需再次实例化它即可。
unset($foo); // $foo is gone
$foo = array(); // $foo is here again
$foo = array();
?
global $foo; unset($foo);
还是unset($GLOBALS['foo']);
unset
将从$foo
符号表中清除。我在谈论我可能会建议的非常大的表,$foo = null; unset($foo);
因为这样也可以更好地清除内存。但是,该行为(GC)并不是很稳定,并且可能会在PHP版本上发生变化。
$foo = array();
:实际上其中可能存在概念上的问题:重新实例化结构与清空结构不同。当您处理内存时,您会发现分配缓慢是不一样的。因此,尽管易于使用,但重新实例化可能不是此问题的答案,特别是如果需要多次快速完成这一问题时。它可能起作用,但是那将严重依赖于IMO的PHP内存管理。
如果只想将变量重置为空数组,则可以简单地将其初始化:
$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
遗憾的是,我无法回答其他问题,没有足够的声誉,但是我需要指出一些对我来说非常重要的事情,我认为这也会对其他人有所帮助。
除非您需要原始数组的引用,否则取消设置变量是一种不错的方法!
弄清楚我的意思:如果您有一个函数,它使用数组的引用,例如排序函数,例如
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
。
怎么$array_name = array();
样
使用array_splice
空的数组,并保留参考:
array_splice($myArray, 0);
我看到这个问题确实很老,但是针对这个问题,我编写了一个递归函数来取消设置数组中的所有值。递归,因为给定数组中的值也可能是数组。这样对我有用:
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;
}
因此,我得到了具有所有键和子数组的数组,但是空值。
也许是简单,经济的方式(无需使用任何标志)...
$array = [];
我们可以阅读php手册:
从PHP 5.4开始,您还可以使用短数组语法,该语法用[]替换array()。
在未设置时,垃圾回收器做它的回合,而没有午休功能是非常有用的;
但是unset函数只是破坏了对数据的变量引用,数据仍然存在于内存中,尽管不再有指向它的指针,PHP仍将内存视为正在使用。
解决方案:
分配null
给变量以清除数据,至少直到垃圾收集器将其保留为止。
$var = null;
然后以类似方式取消设置!
unset($var);
null
会立即进行垃圾回收。你有参考吗?
NULL
将替换存储在$var
变量位置的值?
$var
以指向某个全局NULL
对象,而将$var
的数据保留下来,直到对其进行垃圾收集为止。为什么会强制解释器立即覆盖该数据?
unset($array)
?