【发布时间】:2011-06-08 03:10:44
【问题描述】:
这是一个简单的编程问题,因为我不了解 PHP 如何在 foreach 循环期间处理数组复制和取消设置。就像这样,我有一个来自外部源的数组,它以我想要更改的方式格式化。一个简单的例子是:
$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
【问题讨论】:
-
除非您的数据结构非常庞大(占 RAM 的很大一部分),否则您无需担心任何事情。如果php用完一个menory它会告诉你,你可以在php.ini中增加它。
-
这是一个愚蠢的想法。您刚刚介绍了一个副作用,稍后可能会因某些 微优化 而被遗忘:-/ 不,PHP(也不是我所知道的任何其他标准 GC 语言)能够生成数据contained 在可用于回收的数据结构中,而对 container 的引用存在(这不包括软/弱引用等概念)。
unset可以/将导致 PHP GC 启动,但是由于释放的内存压力而获得的实际性能(如果有的话)并非易事。如果这成为问题,然后解决它。 -
这个数组的大小是多少?
-
感谢您的回复。我想知道我是否无缘无故地进行了微优化,所以我很高兴被称为愚蠢。
标签: php foreach unset memory-optimization