L'instruction foreach est plus rapide que l'instruction for, au moins avec PHP 5.3.2.

Pour arriver à cette conclusion, j'ai utilisé les deux scripts, l'un pour tester l'instruction for et l'autre bien évidement pour tester l'instruction foreach.

Voici celui utilisé pour tester for, avec en commentaire la modification à effectuer pour tester foreach :

<?php
//remplacé par "foreach ($array as $value)" pour la version foreach.
for ($range = 100000; $range <= 1000000; $range += 10000)
{
$array = range(1, $range);

$start = microtime(true);
$memory = memory_get_usage();

ob_start();

for ($i = 0, $end = sizeof($array); $i < $end; $i++)
{
//remplacé par "echo $value;" pour la version foreach
echo $array[$i];
}

ob_end_clean();

$duration = microtime(true) - $start;
$memory = memory_get_usage() - $memory;

echo $range . ';' . $duration . ';' . $memory . ';' . memory_get_peak_usage() . "\n";

unset($array);
}

?>

Donc comme je le disais, foreach est plus rapide que for... de... attention... roulement de tambour... 3% en moyenne.

Je ne parlerai même pas du différentiel en terme d'occupation mémoire, tellement il frise le ridicule.

Tout cela pour dire que ce genre de débat ressemble furieusement à celui opposant print à echo, et que j'ai furieusement l'impression que certaines personnes ont un amour particulier pour les drosophiles.

D'autant qu'en plus, le débat n'a même pas lieu d'être, notament depuis l’avènement de PHP 5.

L'instruction foreach a en effet ceci de pratique depuis cette époque qu'elle est capable de s'interfacer directement avec un objet de la classe iterator ou qui implémente l'interface iteratorAggregate.

C'est d'ailleurs tellement pratique que je n'utilise pratiquement plus que des itérateurs dans mon code, au dépend de l'instruction for, qui ne permet aucunement cela.

Les deux instructions sont donc fondamentalement différentes dans leur philosophie, for étant une instruction simple alors que foreach est magique et permet de parcourir des objets, éventuellement multi-dimensionnels et/ou récurisifs.

Enfin, si l'on se cantonne strictement au parcours de tableaux, for était plus pratique que foreach en PHP 4 car il permettait la modification des valeurs du tableau, ce que ne permettait pas foreach, qui travaillait à l'époque sur une copie du tableau qu'il recevait en argument.

Or, PHP 5 a éliminé cet inconvénient en permettant l'utilisation de l'opérateur & dans une instruction foreach.

Pour une manipulation de tableaux à une dimension, for et foreach sont donc devenues strictement équivalentes depuis PHP 5, fonctionnellement parlant.

Je suis donc surpris que des référents techniques se posent ce type de questions existentielles et encore plus qu'ils acceptent de prendre part à ce genre de débat stérile.

A mon sens, ils devraient préconiser une solution en fonction des avantages fonctionnels qu'elle apporte dans le contexte d’exécution, et non en terme de performance, surtout dans ce cadre.

En effet, ce paramètre est très peu pertinent dans le cas d'instructions de bas niveau, et il est de plus susceptible d'évoluer, dans un sens ou dans l'autre, en fonction des versions du langage.