这是一个简单的编程问题,来自于我对在foreach循环期间
PHP如何处理数组复制和取消设置缺乏了解.就像这样,我有一个阵列从我想要改变的外部源格式来找我.一个简单的例子是:
$myData = array('Key1' => array('value1','value2'));
但我想要的是:
$myData = array([0] => array('MyKey' => array('Key1' => array('value1','value2'))));
所以我采用第一个$myData并将其格式化为第二个$myData.我的格式化算法完全没问题.我的问题在于找到一种节省内存的方法,因为这些数组可能会有点笨拙.因此,在我的foreach循环中,我将当前数组值复制到新格式,然后我从原始数组中取消设置我正在使用的值.例如.:
$formattedData = array(); foreach ($myData as $key => $val) { // do some formatting here,copy to $reformattedVal $formattedData[] = $reformattedVal; unset($myData[$key]); }
调用unset()是不是一个好主意?即,它是否节省了内存,因为我复制了数据而不再需要原始值?或者,PHP是否自动垃圾收集数据,因为我没有在任何后续代码中引用它?
代码运行正常,到目前为止,我的数据集的大小可以忽略不计,无法测试性能差异.我只是不知道我是否为自己设置了一些奇怪的错误或cpu命中.
感谢您的任何见解.
-sR
使用& amp;来改变foreach循环中变量的引用.操作符.这避免了在内存中复制数组以便foreach迭代.
原文链接:https://www.f2er.com/php/137946.html编辑:正如Artefacto指出的那样,取消设置变量只会减少对原始变量的引用次数,因此保存的内存只是指针而不是变量的值.奇怪地使用引用实际上增加了总内存使用量,因为可能是将值复制到新的内存位置而不是被引用.
Unless the array is referenced,
foreach operates on a copy of the
specified array and not the array
itself. foreach has some side effects
on the array pointer. Don’t rely on
the array pointer during or after the
foreach without resetting it.
使用memory_get_usage()
来识别您正在使用的内存量.
有关内存使用和分配的良好记录here.
这是查看内存分配的有用测试代码 – 尝试取消注释注释行以查看不同方案中的总内存使用情况.
echo memory_get_usage() . PHP_EOL; $test = $testCopy = array(); $i = 0; while ($i++ < 100000) { $test[] = $i; } echo memory_get_usage() . PHP_EOL; foreach ($test as $k => $v) { //foreach ($test as $k => &$v) { $testCopy[$k] = $v; //unset($test[$k]); } echo memory_get_usage() . PHP_EOL;