清空数组中所有值,哪种方法更有效?第一种方法需要我在第二个示例的循环中每次使用该函数。
foreach ($array as $i => $value) {
unset($array[$i]);
}
或者这个
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
我不想使用unset()
,因为这会删除变量。
清空数组中所有值,哪种方法更有效?第一种方法需要我在第二个示例的循环中每次使用该函数。
foreach ($array as $i => $value) {
unset($array[$i]);
}
或者这个
foreach($blah_blah as $blah) {
$foo = array();
//do something
$foo = null;
}
我不想使用unset()
,因为这会删除变量。
如下评论中Zack所说,你可以通过重新实例化它来解决问题:
$foo = array(); // $foo is still here
如果你需要更强大的功能,请使用 unset,因为它还会从符号表中清除 $foo,如果以后需要该数组,请再次实例化。
unset($foo); // $foo is gone
$foo = array(); // $foo is here again
如果我们讨论的是非常大的表格,我可能会建议
$foo = null;
unset($foo);
由于这也会更好地清除内存。然而,垃圾回收的行为并不是非常稳定,可能会随着 PHP 版本的更改而发生变化。请注意,重新实例化一个结构体并不等同于清空它。
global $foo; unset($foo);
或者 unset($GLOBALS['foo']);
。 - 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
取消变量设置是一种不错的方法,除非你需要原始数组的引用!
为了清楚我的意思:
如果您有一个使用数组引用的函数,例如像排序函数一样的函数
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
循环:
for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }
虽然如果可能的话,使用
$array = array();
将数组重置为空数组是更好的做法。
那么 $array_name = array();
怎么样?
<?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
?>
$array = [];
我们可以在PHP手册中读到:
从PHP 5.4开始,您还可以使用简短的数组语法,它将array()替换为[]。
我看到这个问题很旧了,但是为了解决这个问题,我编写了一个递归函数来取消数组中的所有值。使用递归是因为给定数组中的值也可能是一个数组。所以这对我有用:
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;
}