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)
除非您通过引用访问元素,否则取消设置将不会执行任何操作,因为您无法在迭代器内更改数组。
也就是说,修改要迭代的集合通常被认为是不好的做法 - 更好的方法是将源数组分解为更小的块(通过一次仅加载源数据的一部分)并处理这些块,随时取消设置每个整个数组“块”。