2009-11-16 200 views
4

我正在使用foreach循環來處理一大組項目,不幸的是它使用了大量的內存。 (可能是因爲它正在做數組的副本)。 顯然有一種方法可以用以下代碼節省一些內存:$items = &$array;PHP - Foreach循環和資源

使用for循環代替它會更好嗎?

是否有辦法在foreach循環中處理它們後立即銷燬每個項目。

例如。

$items = &$array; 
    foreach($items as $item) 
    { 
    dosomethingwithmy($item); 
    destroy($item); 
    } 

我只是尋找處理大量項目而不耗盡資源的最佳方式。

回答

6

嘗試for循環:

$keys = array_keys($array); 
for ($i=0, $n=count($keys); $i<$n; ++$i) { 
    $item = &$array[$keys[$i]]; 
    dosomethingwithmy($item); 
    destroy($item); 
} 
+0

請把外面的數字加上。你會獲得一些性能 – 2009-11-16 21:19:04

+1

@Gabriel Sosa:'count'已經只被調用一次。 – Gumbo 2009-11-16 21:37:17

+0

我的腳本在此循環中使用的內存減少了50%。 – Roch 2009-11-17 09:18:56

4

資源的角度來看,你的代碼會更有效率,如果你使用一個for循環,而不是一個foreach循環。 foreach循環的每次迭代都會將當前元素複製到內存中,這會花費時間和內存。使用索引來訪問當前項目會更好更快。

1

使用本:

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

} 

因爲的foreach只要它創建一個副本

1

如果你正在從數據庫中設置大量數據時,它往往可以幫助嘗試和消費的數據集來自數據庫。例如從php mysql_fetch_array文檔。

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

此循環不會創建整個數據集的內存副本(至少不會冗餘)。我的一個朋友使用這種技術將她的查詢處理速度提高了10倍(她的數據集是生物的,因此它們可以變得很大)。