哪种方法更有效地清除数组中的所有值?第一个例子要求我在第二个例子的每次循环中都使用这个函数。
foreach ($array as $i => $value) { unset($array[$i]); }
或者这个
foreach($blah_blah as $blah) { $foo = array(); //do something $foo = null; }
我不想使用unset(),因为这会删除变量。
unset()
unset()还不够好吗?
unset($array);
如果数组是结合律,我就说第一个。如果不是,使用for循环:
for
for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }
如果可能的话,使用
$array = array();
最好将数组重置为空数组。
如果你只是想将一个变量重置为空数组,你可以简单地重新初始化它:
$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
就像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版本中发生变化。请记住,重新实例化一个结构并不等同于清空它。
$array_name = array();呢?
$array_name = array();
取消变量设置是一个很好的方法,除非你需要原始数组的引用!
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被再次创建并正确填充,但这些值不能从函数外部访问。
unset
$array
因此,如果你有引用,你需要使用$array = array()而不是unset,即使它不那么干净和可以理解。
$array = array()
设置函数在垃圾收集器没有午休时间进行巡视时非常有用;
然而,unset函数只是破坏了对数据的变量引用,数据仍然存在于内存中,PHP认为内存正在使用,尽管不再有指向它的指针。
<强>解决方案: 将null分配给你的变量以清除数据,至少在垃圾收集器得到它之前
null
$var = null;
然后以类似的方式取消设置!
unset($var);
使用array_splice清空数组并保留引用:
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 ?>
我看到这个问题真的很老了,但对于这个问题,我写了一个递归函数来取消数组中的所有值。递归是因为给定数组中的值可能也是一个数组。这对我来说是可行的:
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; }
因此,我得到的数组与所有的键和子数组,但空值。
也许是简单经济的方式(少用指示牌)…
$array = [];
我们可以在php手册中读到:
从PHP 5.4开始,您还可以使用短数组语法,它将array()替换为[]。
帖子并没有真正回答这个问题。问题的重点是保留键和清除值。
foreach($resultMasterCleaned['header'] as $ekey => $eval) { $resultMasterCleaned[$key][$eval] = ""; }
就像在保存CSV值的二维数组的情况下,将某一行空白。循环似乎是唯一的方法。
[]比数组()快30% 类似于将新元素推入数组 $array[] = $newElement然后array_push($array, $newElement) (请记住,array_push仅对单个或两个新元素较慢)
原因是我们跳过开销函数去调用它们
PHP数组vs[]在方法和变量声明