清除PHP数组值的最佳方法

el_*_*_le 158 php arrays

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

foreach ($array as $i => $value) {
    unset($array[$i]);
}
Run Code Online (Sandbox Code Playgroud)

或这个

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*itz 234

就像Zack在下面的评论中所说,你可以简单地使用它来重新实例化它

$foo = array(); // $foo is still here
Run Code Online (Sandbox Code Playgroud)

如果你想要更强大的东西使用unset,因为它也将从符号表中清除$ foo,如果你稍后需要该数组再次实例化它.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Run Code Online (Sandbox Code Playgroud)

  • 为什么不将它重新实例化为`$ foo = array();`? (60认同)
  • @vivoconunxino我是这样编写的,因为作者质疑"清除PHP数组值的最佳方法".这是"明确的",而不是"新的实例".使用`unset`将清除符号表中的`$ foo`.我在谈论非常大的表我可能会推荐`$ foo = null; unset($ foo);`因为那样也会更好地清除内存.然而,该行为(GC)不是很稳定,可能会改变PHP版本. (7认同)
  • unset()有时非常糟糕,如果使用错误会导致麻烦.它没有正确回答OP的回答.不知道他为什么接受这个作为最佳答案,他对自己问题的评论说未设置的问题是它删除了变量.要查看此解决方案导致的问题,请查看我的答案[此处](http://stackoverflow.com/questions/10261925/best-way-to-clear-a-php-arrays-values/22664705#22664705) . (5认同)
  • @NishamMahsin要么使用`global $ foo; unset($ foo);`或`unset($ GLOBALS ['foo']);` (2认同)
  • 对于所有支持 `$foo = array();` 的人:实际上其中可能存在一个概念问题:重新实例化结构与清空它不同。在处理内存时,您知道这与分配速度慢不是一回事。因此,尽管易于使用,但重新实例化可能不是这个问题的答案,特别是如果需要多次快速地执行此操作。它可能有效,但在我看来,这将严重依赖 PHP 内存管理。 (2认同)

mpe*_*pen 77

如果您只想将变量重置为空数组,则只需重新初始化即可:

$foo = array();
Run Code Online (Sandbox Code Playgroud)

请注意,这将保留对它的任何引用:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!
Run Code Online (Sandbox Code Playgroud)

如果要中断对它的任何引用,请先取消设置:

$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
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是最好的答案.应该被接受.它显示了最简单的方法,并且还描述了为什么以及何时应该使用`unset`.+1 (3认同)

Wol*_*lvt 31

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

取消设置变量是一种很好的方法,除非你需要原始数组的引用!

为了弄清楚我的意思:如果你有一个使用数组引用的函数,比如一个排序函数

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它不工作!这里要小心,unset删除引用,以便$array再次创建并正确填充变量,但是不能从函数外部访问这些值.

因此,如果您有参考,您需要使用$array = array()而不是unset,即使它不那么干净和可理解.

  • 这应该是答案 - OP表示清除数组值,而不是取消引用整个数组变量. (3认同)

Mad*_*iha 12

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

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }
Run Code Online (Sandbox Code Playgroud)

虽然如果可能,使用

$array = array();
Run Code Online (Sandbox Code Playgroud)

最好将数组重置为空数组.


Joh*_*nde 9

是不是unset()不够好?

unset($array);
Run Code Online (Sandbox Code Playgroud)


Bib*_*ath 6

怎么样$array_name = array();


All*_*ine 5

使用array_splice空的数组,并保留参考:

array_splice($myArray, 0);