清除PHP数组的最佳方法';s值
在清除数组中的所有值时,哪个更有效?第一个示例要求我在第二个示例的循环中每次都使用该函数清除PHP数组的最佳方法';s值,php,arrays,Php,Arrays,在清除数组中的所有值时,哪个更有效?第一个示例要求我在第二个示例的循环中每次都使用该函数 foreach ($array as $i => $value) { unset($array[$i]); } 还是这个 foreach($blah_blah as $blah) { $foo = array(); //do something $foo = null; } 还不够好吗 unset($array); 如果数组是关联的,我会说第一个。如果不是,请使用
foreach ($array as $i => $value) {
unset($array[$i]);
}
还是这个
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
还不够好吗
unset($array);
如果数组是关联的,我会说第一个。如果不是,请使用
for
循环:
for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }
最好将数组重置为空数组。如果只想将变量重置为空数组,只需重新初始化即可:
$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
正如Zack在下面的评论中所说,您可以使用
$foo = array(); // $foo is still here
如果您想要更强大的功能,请使用unset,因为它还将从符号表中清除$foo,如果您稍后需要该数组,请再次实例化它
unset($foo); // $foo is gone
$foo = array(); // $foo is here again
怎么样
$array_name=array()代码>?很遗憾,我不能回答其他问题,没有足够的声誉,但我需要指出一些对我来说非常重要的事情,我认为这也会帮助其他人
取消设置变量是一种很好的方法,除非您需要原始数组的引用强>
为了明确我的意思:
如果您有一个使用数组引用的函数,例如排序函数,如
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
,即使它不那么干净和易懂。当垃圾收集器在没有午休的情况下进行循环时,该函数很有用
然而unset函数只是简单地破坏了对数据的变量引用,数据仍然存在于内存中,PHP认为内存正在使用,尽管不再有指向它的指针
解决方案:
将null
赋值给变量以清除数据,至少在垃圾收集器获得数据之前是这样
$var = null;
然后以类似的方式取消设置它
unset($var);
用于清空数组并保留引用:
array\u拼接($myArray,0)代码>这是功能强大且经过测试的
未设置($gradearray)//重新设置数组我使用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
?>
我知道这个问题很老了,但对于这个问题,我编写了一个递归函数来取消设置数组中的所有值。递归,因为给定数组中的值也可能是数组。这对我来说很有用:
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;
}
因此,我得到了包含所有键和子数组的数组,但值为空。可能是一种简单、经济的方法(使用的符号更少)
我们可以在php手册中阅读:
从PHP5.4开始,您还可以使用短数组语法,它将数组()替换为[]
这些帖子并没有真正回答这个问题。保留键和清除值是问题的焦点
foreach($resultMasterCleaned['header'] as $ekey => $eval) {
$resultMasterCleaned[$key][$eval] = "";
}
与包含CSV值的二维数组的情况相同,并清空特定行。循环似乎是唯一的方法。对于PHP>=5.4使用
$var = [];
不确定它是否比
$var = array();
但至少看起来更干净。取消设置($array)
有什么问题?删除变量。是的,但为什么要计算以这种方式设置的空数组?源?内存中没有一个变量看起来比var为null的变量小。为什么不把它重新实例化为$foo=array()代码>?@NishamMahsin使用全局$foo;未结算($foo)代码>或未设置($GLOBALS['foo'])
@vivoconuxino我这样写是因为作者提出了“清除PHP数组值的最佳方法”的问题。它说的是“清除”,而不是“新实例”。使用unset
将从符号表中清除$foo
。我说的是非常大的表,我可能会推荐$foo=null;未结算($foo)代码>因为这样也可以更好地清除内存。但是,这种行为(GC)不是很稳定,可能会随着PHP版本的变化而改变。unset()有时非常糟糕,如果使用错误,可能会造成麻烦。它不能正确回答OPs问题。我不知道他为什么接受这个作为最佳答案,他对自己问题的评论说,unset的问题是它删除了变量。要了解这种解决方案会导致哪些问题,请查看我的答案代码>:实际上可能有一个概念上的问题:重新实例化一个结构和清空它是不同的。当处理内存时,你知道这和分配缓慢不是一回事。因此,尽管很容易使用,但重新实例化可能不是这个问题的答案,特别是如果需要多次快速地进行重新实例化的话。它可能会工作,但这在很大程度上依赖于PHP内存管理,IMO。这应该是答案-OP说的是清除数组值,而不是反引用整个数组变量。这听起来不正确。我认为将其设置为null
不会强制立即进行垃圾收集。你对此有参考吗?@mpen你同意赋值NULL
将替换本例中存储在$var
变量位置的值吗?@AnthonyRutledge不,我不同意。据我所知,PHP将简单地更新$var
以指向某个全局NULL
对象,并将$var
的数据保持在垃圾收集之前。为什么口译员会被迫立即覆盖这些数据?@mpen这是一个好问题,但在那个世界上,至少一切都准备好了。的确如此。关键是,我怀疑在取消设置它之前将它设置为null将有助于任何人,我认为这是最好的答案。应该是ac
$var = [];
$var = array();