php – 在迭代期间保存内存时是否取消设置数组值?
这是一个简单的编程问题,来自于我对在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命中. 感谢您的任何见解.
使用& amp;来改变foreach循环中变量的引用.操作符.这避免了在内存中复制数组以便foreach迭代.
编辑:正如Artefacto指出的那样,取消设置变量只会减少对原始变量的引用次数,因此保存的内存只是指针而不是变量的值.奇怪地使用引用实际上增加了总内存使用量,因为可能是将值复制到新的内存位置而不是被引用.
使用 有关内存使用和分配的良好记录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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |