使用foreach循环清空PHP数组值的效率问题

202

清空数组中所有值,哪种方法更有效?第一种方法需要我在第二个示例的循环中每次使用该函数。

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

或者这个

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

我不想使用unset(),因为这会删除变量。


2
是的,但是你为什么想要评估一个以这种方式设置的空数组呢? - Blake
3
来源?内存中没有变量似乎不会比变量为null更小。 - Blake
13个回答

307

如下评论中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 版本的更改而发生变化。请注意,重新实例化一个结构体并不等同于清空它。


1
如果它是一个全局数组 - Nisham Mahsin
2
@NishamMahsin 要么使用 global $foo; unset($foo); 或者 unset($GLOBALS['foo']); - Eric Herlitz
5
如果使用不当,unset()有时会非常糟糕并且可能会引起问题。它不能正确回答OP的问题。不知道为什么他接受了这个作为最佳答案,他在自己的问题评论中说unset的问题是删除变量。要查看此解决方案可能引起的问题,请查看我在此处的答案:https://dev59.com/_2kv5IYBdhLWcg3w6k_j#22664705。 - Wolfsblvt

95

如果你只想将一个变量重置为空数组,你可以简单地重新初始化它:

$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

这是我的代码:https://justpaste.it/1gt46。如何在变量中声明多个ID?单个值的声明是:$productId = 19; 如何在$productId中声明多个值? - Gem
@Rathinam 不确定这与清除数组有什么关系。请在Stackoverflow上发布一个新问题,并将您的代码直接粘贴到问题中。 - mpen

33

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

为了清楚我的意思:

如果您有一个使用数组引用的函数,例如像排序函数一样的函数

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,即使这样做显得不太干净和易懂。


13

如果数组是关联数组,我会选择第一种方式。如果不是,就使用 for 循环:

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

虽然如果可能的话,使用

$array = array();

将数组重置为空数组是更好的做法。


9

unset() 不够好吗?

unset($array);

7
使用 array_splice 函数来清空数组并保留引用: array_splice($myArray, 0);

7

那么 $array_name = array(); 怎么样?


3
我曾使用unset()来清空数组,但我发现unset()将使数组变为null,因此需要重新声明数组,例如:
<?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
?>

3
也许有一种简单、经济的方法(使用较少的标记)...
$array = [];

我们可以在PHP手册中读到:

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


@KulshreshthK 这样做的作用是重新初始化数组,非常简单,就像清空数组或重新创建它或将其带回重置状态。 - John Max

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;

}

因此,我获得了包含所有键和子数组的数组,但值为空。

这个问题绝不是在寻求递归方法。看起来你正在回答自己对这个问题要求的发明扩展。从你的脚本中受益的研究人员不太可能在这个页面上找到你的答案。最好提出一个新的、狭窄/具体的问题并自我回答。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接