Fonctionnement de foreach en PHP : anatomie du cycle

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : foreach, bien plus qu'un simple sucre syntaxique

\n\n

Chaque développeur PHP, du débutant au gourou, utilise foreach presque quotidiennement. Cela semble si simple et évident : « parcourir chaque élément d'un tableau ». Mais vous êtes-vous déjà demandé : comment PHP fait-il exactement cela ? Pourquoi un même foreach se comporte-t-il différemment avec les tableaux et les objets ? Pourquoi modifier un tableau à l'intérieur d'une boucle mène-t-il parfois à des résultats inattendus ?

\n\n

La question « How does PHP 'foreach' actually work? » sur Stack Overflow a accumulé des dizaines de milliers de vues et des centaines de votes. Ce n'est pas un hasard : sous le capot de cet opérateur en apparence simple se cache un mécanisme complexe et élégant. Aujourd'hui, nous plongeons au cœur de PHP pour décortiquer l'anatomie de la boucle foreach étape par étape.

\n\n

À la fin de cet article, vous comprendrez non seulement comment fonctionne foreach, mais vous apprendrez aussi à éviter les erreurs typiques qui guettent même les programmeurs expérimentés. C'est parti !

\n\n

Chapitre 1 : foreach et le pointeur interne du tableau

\n\n

Lorsque PHP rencontre la construction foreach ($array as $value), il ne se contente pas de « parcourir les indices ». Le mécanisme sous-jacent repose sur le pointeur interne du tableau (internal array pointer). C'est une « petite flèche » invisible qui pointe vers l'élément courant.

\n\n

Voici le processus étape par étape :

\n\n
    \n
  1. Réinitialisation du pointeur. PHP appelle reset($array) — le pointeur se place sur le premier élément.
  2. \n
  3. Lecture de la clé et de la valeur. L'élément courant du tableau est récupéré.
  4. \n
  5. Assignation. La valeur est copiée dans la variable $value (sauf en présence de &).
  6. \n
  7. Déplacement du pointeur. PHP avance le pointeur vers l'élément suivant.
  8. \n
  9. Répétition. Les étapes 2 à 4 sont exécutées jusqu'à ce que le pointeur atteigne la fin du tableau.
  10. \n
\n\n

Cependant, il y a un détail important : PHP crée une copie du tableau avant de commencer l'itération ! Voyons pourquoi.

\n\n

Exemple : réinitialisation du pointeur dans la boucle

\n\n
<?php\n$array = [10, 20, 30];\n\nforeach ($array as $value) {\n    echo "$value\\n";\n    // Tentative de réinitialisation du pointeur\n    reset($array);\n}\n// Affichage : 10, 20, 30 — reset n'a pas affecté foreach\n?>
\n\n

Pourquoi reset() n'a-t-il pas fonctionné ? Parce que foreach travaille avec une copie du pointeur interne, pas avec l'original. Cela a été conçu exprès pour que la modification du tableau à l'intérieur de la boucle ne casse pas l'itération.

\n\n

Chapitre 2 : foreach par valeur vs par référence

\n\n

La source de confusion la plus courante est la différence entre foreach ($array as $value) et foreach ($array as &$value). Mettons les choses au clair.

\n\n

foreach par valeur : copie à chaque étape

\n\n

Quand vous écrivez foreach ($array as $value), PHP copie la valeur courante du tableau dans la variable $value à chaque itération. Cela signifie que modifier $value n'affecte en rien le tableau d'origine.

\n\n
<?php\n$array = [1, 2, 3];\nforeach ($array as $value) {\n    $value *= 2; // On modifie la copie\n}\nprint_r($array);\n// Affichage : [1, 2, 3] — le tableau n'a pas changé\n?>
\n\n

Avantage : Sécurité, les données d'origine restent intactes.
\nInconvénient : Si les éléments du tableau sont de gros objets, la copie peut être coûteuse. Cependant, PHP utilise le copy-on-write ; pour les tableaux d'objets, seuls les identifiants (handles) sont copiés, pas les objets eux-mêmes.

\n\n

foreach par référence : travailler avec l'original

\n\n

La syntaxe foreach ($array as &$value) force PHP à passer une référence à l'élément, et non une copie. Désormais, $value est un alias de l'élément du tableau.

\n\n
<?php\n$array = [1, 2, 3];\nforeach ($array as &$value) {\n    $value *=

Blogs

Book Recommendations