我正在使用foreach循环处理大量项目,不幸的是它正在使用大量内存。 (可能是因为它正在做一个数组的副本)。
显然,有一种方法可以使用以下代码保存一些内存:$items = &$array;
使用for
循环不是更好吗?
有没有办法在foreach循环中处理完每个项目后立即销毁它们。
例如
$items = &$array;
foreach($items as $item)
{
dosomethingwithmy($item);
destroy($item);
}
我只是在寻找处理大量物品的最佳方法,而不会耗尽资源。
答案 0 :(得分:6)
尝试for
循环:
$keys = array_keys($array);
for ($i=0, $n=count($keys); $i<$n; ++$i) {
$item = &$array[$keys[$i]];
dosomethingwithmy($item);
destroy($item);
}
答案 1 :(得分:4)
在资源方面,如果使用for循环而不是foreach循环,则代码将更有效。 foreach循环的每次迭代都会将当前元素复制到内存中,这需要时间和内存。使用索引和使用索引访问当前项目会更好更快。
答案 2 :(得分:1)
使用它:
reset($array);
while(list($key_d, $val_d) = each($array)){
}
因为foreach创建了一个副本
答案 3 :(得分:1)
如果从数据库中获取大型数据集,通常可以在数据库出现时立即尝试使用数据集。例如,来自php mysql_fetch_array文档。
$resource = mysql_query("query");
while ($row = mysql_fetch_array($resource, MYSQL_NUM)) {
process($row);
}
此循环不会创建整个数据集的内存副本(至少不会冗余)。我的一个朋友使用这种技术加速了她的一些查询处理(她的数据集是生物学的,所以它们可以变得非常大)。