5

我有一个包含多个键、值、对象等的数组。我需要清空该数组,但我想以最有效的方式进行操作。

我能想到的最好的是:

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

但是我不喜欢必须循环遍历数组来清空它的想法。肯定有一种很好的巧妙/聪明的方法可以做到这一点,而不会浪费内存来创建一个新数组?

注意:我不确定自己在再次将数组创建为新数组时是否需要额外的内存。如果没有,则 $array = new array(); 将是“清空”它的好方法。

4

6 回答 6

5

只需尝试:

$array = array();
于 2013-01-18T12:47:40.127 回答
2

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

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

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

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

于 2013-01-18T12:54:58.830 回答
1

这很简单:

$array = array();

$array 将是现有的数组类型(但为空),并且您的数据可以稍后从内存中被垃圾。

于 2013-01-18T12:49:04.353 回答
0

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

于 2013-01-18T12:48:20.980 回答
0

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

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

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

于 2013-01-18T12:57:59.230 回答
0

试试这个:

// $array is your original array

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

以上将使您的数组空白,保持键不变。

希望这可以帮助。

于 2013-01-18T13:07:58.617 回答