PHP - Foreach 循环和资源

4
我正在使用foreach循环来处理一组大量的项目,不幸的是它占用了很多内存(可能是因为它在对数组进行复制)。 显然,可以通过以下代码节省一些内存:$items = &$array; 难道使用for循环不是更好吗?
而且,在foreach循环中是否有一种方法在每个项目被处理后立即销毁它们。
    $items = &$array;
    foreach($items as $item)
    {
     dosomethingwithmy($item);
     destroy($item);
    }

我只是在寻找处理大量物品而不耗尽资源的最佳方法。
4个回答

6
尝试使用“for”循环:
$keys = array_keys($array);
for ($i=0, $n=count($keys); $i<$n; ++$i) {
    $item = &$array[$keys[$i]];
    dosomethingwithmy($item);
    destroy($item);
}

1
请将计数器放在for循环外部,这样可以提高程序性能。 - Gabriel Sosa
我的脚本使用这个循环后,内存减少了50%。 - Roch
1
@mnml:这是可预测的,因为 foreach 使用数组的内部副本,从而将该数组的内存使用量加倍。 - Gumbo
在 PHP 中进行内部复制并不一定意味着双倍的内存消耗。 - Alin Purcaru
这不是 $i 的预增 (++$i) 吗?你会错过 $keys0th 索引。 - Uday Sawant
我们是否遗漏了第0个元素? - snh_nl

5

就资源而言,如果您使用for循环而不是foreach循环,则代码将更加高效。每次迭代foreach循环都会复制当前元素到内存中,这需要时间和内存。使用for并通过索引访问当前项会更好和更快。


1

如果您从数据库获取大量数据集,尝试在数据集从数据库中返回后立即使用它通常会有所帮助。例如,可以参考php mysql_fetch_array文档。

$resource = mysql_query("query");
while ($row = mysql_fetch_array($resource, MYSQL_NUM)) {
    process($row);
}

这个循环不会在内存中创建整个数据集的副本(至少不是冗余的)。我的一个朋友使用这种技术加速了部分查询处理,加速了10倍(她的数据集是生物学数据,因此可能相当大)。


1

使用这个:

reset($array);
while(list($key_d, $val_d) = each($array)){

}

因为foreach会创建一个副本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接