使用 foreach 循环清除 PHP 数组值的效率


Efficiency of using foreach loops to clear a PHP array's values

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

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); 

因为那也会更好地清除内存。但是,该行为(GC)不是很恒定,并且可能会在PHP版本中发生变化。请记住,重新实例化结构与清空结构不同。

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

$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();

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

unset()还不够好吗?

unset($array);

$array_name = array();怎么样?

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

array_splice($myArray, 0);

我已经使用 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
?>

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

$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;
}

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

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

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

溶液:null分配给变量以清除数据,至少在垃圾回收器掌握数据之前。

$var = null;

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

unset($var);

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

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

就像保存CSV值的二维数组一样,并空白特定行。循环似乎是唯一的方法。

[] 比 array() 快近 30%类似于将新元素推送到数组$array[] = $newElement则 array_push($array, $newElement)(请记住array_push只有单个或 2 个新元素的速度较慢)

原因是我们跳过开销函数来调用那些

PHP 数组与方法 和变量声明中的 [ ]