199

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

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

或这个

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

14 回答 14

291

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

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

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

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
于 2012-04-21T18:52:45.513 回答
94

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

$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
于 2012-04-21T18:52:43.173 回答
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,即使它不太干净和易于理解。

于 2014-03-26T14:51:43.817 回答
13

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

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

虽然如果可能的话,使用

$array = array();

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

于 2012-04-21T18:51:04.093 回答
9

unset()不够好吗?

unset($array);
于 2012-04-21T18:50:49.290 回答
7

怎么样$array_name = array();

于 2012-04-21T18:52:56.760 回答
6

用于array_splice清空数组并保留引用:

array_splice($myArray, 0);

于 2016-04-15T10:04:33.037 回答
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
?>
于 2017-10-21T12:33:31.200 回答
3

也许简单,经济的方式(使用较少的标志)......

$array = [];

我们可以阅读 php 手册:

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

于 2019-08-09T10:21:29.053 回答
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;

}

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

于 2019-02-13T15:15:30.010 回答
0

当垃圾收集器在没有午休时间的情况下进行循环时,unset函数很有用;

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

解决方案: 分配null给您的变量以清除数据,至少在垃圾收集器得到它之前。

$var = null;

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

unset($var);
于 2015-03-10T10:54:23.317 回答
0

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

于 2017-04-18T08:24:59.073 回答
0

帖子并没有真正回答这个问题。保留密钥并清除值是问题的重点。

foreach($resultMasterCleaned['header'] as $ekey => $eval) {
    $resultMasterCleaned[$key][$eval] = "";                 
}

与保存 CSV 值并清除特定行的二维数组一样。循环似乎是唯一的方法。

于 2020-08-24T01:48:39.543 回答
0

对于 PHP >= 5.4 使用

$var = []; 

不确定它是否比

$var = array();

但至少看起来更干净。

于 2021-01-28T23:18:47.067 回答