在迭代期间取消设置数组值是否会节省内存?

Sou*_*ser 8 php foreach memory-optimization unset

这是一个简单的编程问题,来自于我对PHP如何在foreach循环中处理数组复制和取消设置缺乏了解.就像这样,我有一个阵列从我想要改变的外部源格式来找我.一个简单的例子是:

$myData = array('Key1' => array('value1', 'value2'));
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

$myData = array([0] => array('MyKey' => array('Key1' => array('value1', 'value2'))));
Run Code Online (Sandbox Code Playgroud)

所以我采取第一个$myData并将其格式化为第二个$myData.我的格式化算法完全没问题.我的问题在于找到一种节省内存的方法,因为这些数组可能会有点笨拙.因此,在我的foreach循环中,我将当前数组值复制到新格式,然后我从原始数组中取消设置我正在使用的值.例如:

$formattedData = array();
foreach ($myData as $key => $val) {
    // do some formatting here, copy to $reformattedVal

    $formattedData[] = $reformattedVal;

    unset($myData[$key]);
}
Run Code Online (Sandbox Code Playgroud)

这是unset()一个好主意吗?即,它是否节省了内存,因为我复制了数据并且不再需要原始值?或者,PHP是否自动垃圾收集数据,因为我没有在任何后续代码中引用它?

代码运行正常,到目前为止,我的数据集的大小可以忽略不计,无法测试性能差异.我只是不知道我是否为自己设置了一些奇怪的错误或以后的CPU命中.

感谢您的任何见解.
-sR

小智 5

我在循环内处理文本 (xml) 文件的行时内存不足。对于任何有类似情况的人来说,这对我有用:

while($data = array_pop($xml_data)){
     //process $data
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ker 0

除非您通过引用访问元素,否则取消设置将不会执行任何操作,因为您无法在迭代器内更改数组。

也就是说,修改要迭代的集合通常被认为是不好的做法 - 更好的方法是将源数组分解为更小的块(通过一次仅加载源数据的一部分)并处理这些块,随时取消设置每个整个数组“块”。

  • @Andy您没有得到的是原始文件和副本共享内存,从原始文件中取消设置不会释放内存,因为副本仍然保留引用。 (2认同)