清除PHP数组值的最佳方法


172

清除数组中的所有值哪个更有效?第一个要求我在第二个示例的循环中每次使用该函数。

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

或这个

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

5
这有什么错unset($array)
布莱克

13
删除变量。
el_pup_le 2012年

2
是的,但是为什么要评估以这种方式设置的空数组?
布莱克

3
资源?内存中没有任何变量似乎不会小于var为null。
布莱克

Answers:


256

就像Zack在下面的评论中说的那样,您只需使用即可重新实例化它

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

如果您想要更强大的功能,请使用unset,因为它还会从符号表中清除$ foo,如果以后需要该数组,只需再次实例化它即可。

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

63
为什么不将其重新实例化为$foo = array();
Zack Zatkin-Gold

2
@NishamMahsin无论使用global $foo; unset($foo);还是unset($GLOBALS['foo']);
Eric Herlitz

7
@vivoconunxino之所以这样写是因为作者质疑“清除PHP数组值的最佳方法”。它说的是“明确”,而不是“新实例”。使用unset将从$foo符号表中清除。我在谈论我可能会建议的非常大的表,$foo = null; unset($foo);因为这样也可以更好地清除内存。但是,该行为(GC)并不是很稳定,并且可能会在PHP版本上发生变化。
埃里克·赫里兹

5
如果使用不正确,unset()有时会很糟糕,并且可能导致麻烦。它不能正确回答操作者的回答。不知道他为什么接受这个最佳答案,他对自己的问题的评论说未设置的问题是删除了变量。要查看此解决方案引起的问题,请在此处查看我的答案。
Wolfsblvt 2014年

2
对于所有支持者$foo = array();:实际上其中可能存在概念上的问题:重新实例化结构与清空结构不同。当您处理内存时,您会发现分配缓慢是不一样的。因此,尽管易于使用,但重新实例化可能不是此问题的答案,特别是如果需要多次快速完成这一问题时。它可能起作用,但是那将严重依赖于IMO的PHP内存管理。
TechNyquist

82

如果只想将变量重置为空数组,则可以简单地将其初始化:

$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

3
我认为这是最好的答案。应该被接受。它显示了最简单的方法,并描述了为什么和何时unset使用。+1

这是我的代码:justpaste.it/1gt46。我如何在变量中声明多个ID。单个值声明为:$ productId = 19; 如何在$ productId =中声明多个值?
宝石

@Rathinam不知道与清除数组有什么关系。请在Stackoverflow上发布一个新问题,并将您的代码直接粘贴到该问题中。
mpen

32

遗憾的是,我无法回答其他问题,没有足够的声誉,但是我需要指出一些对我来说非常重要的事情,我认为这也会对其他人有所帮助。

除非您需要原始数组的引用否则取消设置变量是一种不错的方法

弄清楚我的意思:如果您有一个函数,它使用数组的引用,例如排序函数,例如

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


3
这应该是答案-OP会说清楚数组值,而不是取消引用整个数组变量。
罗斯

13

我要说的是第一个,如果数组是关联的。如果没有,请使用for循环:

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

虽然可能的话,使用

$array = array();

最好将阵列重置为空阵列。





2

我用过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

我看到这个问题确实很老,但是针对这个问题,我编写了一个递归函数来取消设置数组中的所有值。递归,因为给定数组中的值也可能是数组。这样对我有用:

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;

}

因此,我得到了具有所有键和子数组的数组,但是空值。


1

也许是简单,经济的方式(无需使用任何标志)...

$array = [];

我们可以阅读php手册:

从PHP 5.4开始,您还可以使用短数组语法,该语法用[]替换array()。


您还应该解释一下。
Kulshreshth K,

0

未设置时,垃圾回收器做它的回合,而没有午休功能是非常有用的;

但是unset函数只是破坏了对数据的变量引用,数据仍然存在于内存中,尽管不再有指向它的指针,PHP仍将内存视为正在使用。

解决方案: 分配null给变量以清除数据,至少直到垃圾收集器将其保留为止。

$var = null;

然后以类似方式取消设置!

unset($var);

4
听起来不对。我不认为将其设置为null会立即进行垃圾回收。你有参考吗?
mpen 2015年

@mpen您是否同意在此示例中分配NULL将替换存储在$var变量位置的值?
安东尼·鲁特里奇

1
@AnthonyRutledge不,我没有。就我所知,PHP只会简单地更新$var以指向某个全局NULL对象,而将$var的数据保留下来,直到对其进行垃圾收集为止。为什么会强制解释器立即覆盖该数据?
mpen

@mpen这是一个很好的问题,但是在那个世界上,至少所有东西都可以收集了。
安东尼·鲁特里奇

确实。关键是我怀疑将其设置为null,然后再
取消

-1

这是功能强大且经过测试的unset($ gradearray); //重新设置数组


1
要回答这个问题,您应该解释哪种方法是最好的,以及为什么
Fabian Horlacher
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.