Petit benchmark
Mes résultats sont sensiblement constants un exemple de résultat serait:<?php $tab = array(); for($i=0; $i<250000; $i++) { array_push($tab, $i); } $var = ''; $t1 = microtime(true); $m1 = memory_get_usage(); $ct = count($tab); for($i=0; $i<$ct; $i++) { $var .= $i; } $t2 = microtime(true); $m2 = memory_get_usage(); $diff1 = $t2 - $t1; $mdiff1 = $m2 - $m1; $var = ''; $t1 = microtime(true); $m1 = memory_get_usage(); foreach($tab as $i) { $var .= $i; } $t2 = microtime(true); $m2 = memory_get_usage(); $diff2 = $t2 - $t1; $mdiff2 = $m2 - $m1; echo 'for time: '.$diff1.''."\n"; echo 'for mem: '.$mdiff1.''."\n"; echo 'foreach time: '.$diff2.''."\n"; echo 'foreach mem: '.$mdiff2.''."\n";
Ce qui montre que le for est plus rapide que le foreach, en revanche le foreach est effectivement moins gourmand en mémoire, bien sur on parle de pas grand chose mais voila.for time: 0.03811502456665
for mem: 1389512
foreach time: 0.040256023406982
foreach mem: 1388808
J'ai rajouté le while augmenter la ram le nombre d'occurences et un coup de shuffle
<?php ini_set('memory_limit', '1024M'); $truemem = false; $tab = array(); for($i=0; $i<250000; $i++) { array_push($tab, $i); } shuffle($tab); $var = ''; $t1 = microtime(true); $m1 = memory_get_usage($truemem); $ct = count($tab); for($i=0; $i<$ct; $i++) { $var = $i . $tab[$i]; } $t2 = microtime(true); $m2 = memory_get_usage($truemem); $diff1 = $t2 - $t1; $mdiff1 = $m2 - $m1; $var = ''; $t1 = microtime(true); $m1 = memory_get_usage($truemem); foreach($tab as $num=>$i) { $var = $num . $i; } $t2 = microtime(true); $m2 = memory_get_usage($truemem); $diff2 = $t2 - $t1; $mdiff2 = $m2 - $m1; $var = ''; $t1 = microtime(true); $m1 = memory_get_usage($truemem); $ct = count($tab); $i=0; while($i < $ct) { $var = $i . $tab[$i]; $i++; } $t2 = microtime(true); $m2 = memory_get_usage($truemem); $diff3 = $t2 - $t1; $mdiff3 = $m2 - $m1; echo 'for time: '.$diff1.''."\n"; echo 'for mem: '.$mdiff1.''."\n"; echo 'foreach time: '.$diff2.''."\n"; echo 'foreach mem: '.$mdiff2.''."\n"; echo 'while time: '.$diff3.''."\n"; echo 'while mem: '.$mdiff3.''."\n";avantage à foreach, mais pas un gros avantage, je vais voir si je peut trouver un cas ou le foreach est moins bon, en jouant sur ce qui se passe à l'intérieur des boucles.for time: 0.10704684257507
for mem: 632
foreach time: 0.093402862548828
foreach mem: 136
while time: 0.1063129901886
while mem: 88
Un E_NOTICE + 1 null + le dernier oubliéunset($tab[5]);
J'avais lu une étude qui produisait plus ou moins le même résultat (variable suivant la version de PHP entre autres).Petit benchmark
(...)
Ce qui montre que le for est plus rapide que le foreach, en revanche le foreach est effectivement moins gourmand en mémoire, bien sur on parle de pas grand chose mais voila.
Je suis pas sur de comprendre ce que tu veux dire, mais comme tu l'as dit précédement, foreach fonctionne très bien pour les listes à trou, contrairement aux for & while.Un E_NOTICE + 1 null + le dernier oubliéunset($tab[5]);
C'est pas top niveau perf, et là vraiment, surtout le FIFO. Mais je précise Array, puisqu'une pile peut être objet, et la SPL propose des piles.Oki (mon incompréhension était purement syntaxique). On est donc d'accord
Enfin, les piles ça se gère pas mal à coup de array_shift/unshift quand même
<?php
$a = array (5=>'cinq',7=>'sept',2=>'deux');
array_shift($a);
var_dump($a);
afficheraL'importance n'est pas la clé, mais la place de l'élément dans le tableau. C'est aussi pour ça que je ne donne aucune importance à la clé avec PHP, et que je n'utilise plus for(). A l'extreme while(list($cle,$valeur) = each()) est plus logique que for, on est vraiment sur une notion de pointeur.0 => string 'sept' (length=4)
1 => string 'deux' (length=4)