繁体   English   中英

清空数组的最有效方法

[英]Most efficient way to empty an array

我有一个包含几个键,值,对象等的数组。我需要清空该数组但我想以最有效的方式执行它。

我能想到的最好的是:

foreach ($array as $key => $val) unset($array[$key]);

但是我不喜欢不得不循环遍历数组只是为了清空它的想法..当然有一个很好的光滑/聪明的方式来做这个而不浪费内存创建一个新的数组?

注意:我不确定自己是否会在再次创建新阵列时花费额外的内存。 如果没有那么$ array = new array(); 将是一个“清空”它的好方法。

试试:

$array = array();

这在很大程度上取决于你的意思。

要清空当前参考,您可以随时执行此操作

$array = array();

从作用域中完全删除当前实例

unset($array);

不幸的是,这些情况都不一定意味着释放与每个元素相关联的存储器。

PHP适用于变量的“引用”。 您的变量实际上是指向数据的标签或引用,而不是数据的实际容器。 PHP 垃圾收集器可以提供有关此主题的更多信息。

现在看一下这个例子 ,取自文档:

$a = "new string";
$c = $b = $a;
xdebug_debug_zval( 'a' );# a: (refcount=3, is_ref=0)='new string'
unset( $b, $c );
xdebug_debug_zval( 'a' );# a: (refcount=1, is_ref=0)='new string'

遗憾的是,这适用于您的所有变量。 包括数组。 清理与阵列相关的内存是一个完全不同的主题,我担心。


我注意到在关于在每个键上使用unset()的注释中进行了更长时间的讨论。

这感觉非常糟糕。 请考虑以下代码:

class A{
    function __construct($name){$this->name=$name;}
    function __destruct(){echo $this->name;}
}

$a=array();
$b=array();
$c=array();
for($i=0;$i<5;$i++) {
    $a[]=new A('a');
    $b[]=new A('b');
    $c[]=new A('c');
}

unset($a);
$b=array();

echo PHP_EOL.'done'.PHP_EOL;

这将输出:

aaaaabbbbb
done
ccccc

当对特定数据结构的引用达到0时,将从内存中清除它。 两个=array()unset都会做同样的事情。

现在,如果您实际上不需要array() ,则可以使用null

$array=null;

这会将标签保留在内存中,但会删除它对任何特定数据的引用。

这很简单:

$array = array();

$ array将是现有的和数组类型(但是为空),您的数据可以稍后从内存中获取。

那么......为什么不呢: $array = array();

正如Suresh Kamrushi指出的那样,我可以使用array_keys:

foreach (array_keys($array) as $key) unset($array[$key]);

这可能是现在最好的解决方案..但我相信有人会很快想出更好的东西:)

尝试这个:

// $array is your original array

$array = array_combine( array_keys( $array ), array_fill( 0, count($array), 0 ) );

以上将清空您的阵列保持密钥完好无损。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM