2009-11-16 6 views
4

J'utilise une boucle foreach pour traiter un grand nombre d'éléments, malheureusement, il utilise beaucoup de mémoire. (probablement parce qu'il fait une copie du tableau). Apparemment, il y a un moyen d'économiser de la mémoire avec le code suivant: $items = &$array;PHP - Foreach boucles et ressources

est-il pas préférable d'utiliser des boucles for à la place?

Et il existe un moyen de détruire chaque élément dès qu'ils ont été traités dans une boucle foreach.

par ex. Je cherche juste la meilleure manière de traiter beaucoup d'articles sans manquer de ressources.

Répondre

6

Essayez une boucle for:

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

s'il vous plaît mettez le nombre en dehors du pour. vous obtiendrez des performances –

+1

@Gabriel Sosa: 'count' est déjà appelé seulement une fois. – Gumbo

+0

mon script utilise 50% moins de mémoire avec cette boucle. – Roch

4

ressources-sage, votre code sera plus efficace si vous utilisez une boucle, au lieu d'une boucle foreach. Chaque itération de votre boucle foreach va copier l'élément actuel en mémoire, ce qui prendra du temps et de la mémoire. Utiliser et accéder à l'élément actuel avec un index est un peu meilleur et plus rapide.

1

utiliser ceci:

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

} 

parce foreach créer une copie

1

Si vous obtenez que les grandes ensemble de données à partir d'une base de données, il peut souvent aider à essayer de consommer l'ensemble de données dès qu'il vient de la base de données. Par exemple de la documentation php mysql_fetch_array. Cette boucle ne créera pas de copie en mémoire de tout le jeu de données (du moins pas de manière redondante). Une de mes amies a accéléré certains de ses traitements de requête par 10x en utilisant cette technique (ses jeux de données sont biologiques donc ils peuvent devenir assez gros).