我有一个包含多个键、值、对象等的数组。我需要清空该数组,但我想以最有效的方式进行操作。
我能想到的最好的是:
foreach ($array as $key => $val) unset($array[$key]);
但是我不喜欢必须循环遍历数组来清空它的想法。肯定有一种很好的巧妙/聪明的方法可以做到这一点,而不会浪费内存来创建一个新数组?
注意:我不确定自己在再次将数组创建为新数组时是否需要额外的内存。如果没有,则 $array = new 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 ) );
以上将使您的数组空白,保持键不变。
希望这可以帮助。