foreach ($array as $value) exécute le bloc une fois pour chaque élément, avec $value égal à l'élément courant. Pour obtenir aussi la clé, écrivez foreach ($array as $key => $value).
foreach fonctionne sur n'importe quel tableau, quelles que soient ses clés, et vous ne gérez jamais de compteur ni de longueur. C'est la boucle que vous écrirez le plus souvent en PHP.
Parcourir les clés et les valeurs
Dans $key => $value, vous choisissez les noms : $name => $age, $id => $user, $k => $v. Sur une liste, les clés sont les positions 0, 1, 2. Sur un tableau associatif, ce sont les clés de type chaîne que vous avez définies.
La dernière boucle montre un détail qui surprend : une clé de type chaîne qui ressemble à un entier, comme "1", est stockée comme l'entier 1. "01" n'est pas un entier canonique, donc elle reste une chaîne.
Obtenir l'index dans foreach
Sur une liste, la clé est l'index, donc foreach ($items as $i => $item) suffit. Sur un tableau associatif, il n'y a pas de position numérique, gérez donc un compteur. Pour traiter différemment le premier ou le dernier élément, comparez la clé avec array_key_first() ou array_key_last().
La dernière boucle affiche une virgule entre les noms mais pas après le dernier. Pour ce travail précis, implode(', ', array_keys($scores)) est plus court ; le test array_key_last() sert quand le dernier passage a besoin d'une logique différente, pas seulement d'un autre séparateur.
Modifier les valeurs d'un tableau dans foreach (par référence)
$value est une copie. Lui affecter une valeur ne change rien dans le tableau. Pour modifier le tableau, bouclez par référence avec &$value, ou écrivez via la clé.
Les deux fonctionnent. La version par clé ne laisse aucun état caché après la boucle, c'est pourquoi beaucoup d'équipes la préfèrent. Pour construire un nouveau tableau plutôt que d'en modifier un, array_map() est une autre option.
Question voisine : que se passe-t-il si vous ajoutez des éléments pendant la boucle ? Un foreach simple parcourt le tableau tel qu'il était au début de la boucle, donc $prices[] = ... à l'intérieur ne crée pas de passages supplémentaires. Une boucle par référence parcourt le tableau vivant et visite bien les nouveaux éléments.
Le piège de unset() avec foreach par référence
Après foreach ($arr as &$v), la variable $v reste une référence vers le dernier élément du tableau. Si vous réutilisez ensuite le nom $v dans une boucle normale, chaque passage écrit dans ce dernier élément. Exécutez ceci et regardez le dernier élément :
La seconde boucle affecte A, puis B, puis la propre valeur du dernier élément à $letters[2], et au dernier passage cet emplacement contient déjà B. La correction tient en une ligne : placez unset($v); juste après chaque foreach par référence.
break et continue dans foreach
break quitte la boucle, continue passe à l'élément suivant. Un modèle courant est la recherche : bouclez jusqu'à trouver ce qu'il vous faut, puis break pour ne pas vérifier le reste du tableau.
Dans des boucles imbriquées, break 2 quitte la boucle intérieure et celle qui l'entoure, et continue 2 passe au passage suivant de la boucle extérieure.
Tableaux imbriqués et foreach avec list()
Des lignes de données sont des tableaux dans un tableau. Parcourez les lignes, puis chaque ligne, ou extrayez directement les champs dans la ligne foreach avec la déstructuration : [$a, $b] pour les listes, ['key' => $var] pour les lignes associatives. list($a, $b) est l'ancienne écriture de [$a, $b].
La page sur la déstructuration détaille la syntaxe [...] =, y compris les éléments ignorés et les motifs imbriqués.
Construire une liste ou un tableau HTML avec foreach
Dans un template, la forme à deux-points foreach (...): avec endforeach; garde la boucle lisible entre les balises. Ce bloc construit un tableau dont les en-têtes de colonnes sont des liens : cliquez-en un dans l'onglet Page et le même script s'exécute à nouveau avec $_GET['sort'] défini, si bien que les lignes reviennent dans un nouvel ordre.
Deux habitudes à reprendre de ce bloc : la valeur sort venant de l'URL est vérifiée par rapport à une liste de colonnes autorisées avant d'être utilisée, et chaque valeur affichée dans du HTML qui pourrait contenir du texte d'utilisateur passe par htmlspecialchars().
foreach sur null, un tableau vide ou un objet
Un tableau vide ne pose aucun problème : le corps ne s'exécute jamais. null, une chaîne ou un nombre, si : PHP affiche un warning et saute la boucle. Pour $tags = null; foreach ($tags as $tag), il affiche :
Warning: foreach() argument must be of type array|object, null given in /var/www/html/index.php on line 4
Cela arrive surtout avec des données parfois absentes, comme un champ facultatif dans du JSON décodé. Rabattez-vous sur un tableau vide avec ?? :
foreach ($data['tags'] ?? [] as $tag) {
echo $tag;
}
Le mot object dans ce message est réel : foreach sur un objet visite les propriétés visibles depuis l'endroit où tourne la boucle (hors de la classe, les publiques), avec le nom de la propriété comme clé. Les classes qui implémentent Iterator ou IteratorAggregate, ainsi que les générateurs, décident elles-mêmes de ce que voit un foreach.
foreach, for ou array_map
| Utiliser | Quand |
|---|---|
foreach | Vous voulez chaque élément, avec ou sans sa clé. Fonctionne sur tout tableau, liste ou associatif. |
for | Vous comptez (de 1 à 100, un élément sur deux) ou avez besoin des voisins par index ($a[$i - 1]). Voir la boucle for. |
array_map() | Vous construisez un nouveau tableau en transformant chaque élément, souvent en une ligne avec fn. |
array_filter() | Vous ne gardez que les éléments qui passent un test. |
Une façon rapide de décider : si le corps de la boucle se contente de calculer une nouvelle valeur par élément, array_map(fn($x) => $x * 2, $a) le dit en une ligne. S'il a des effets de bord (afficher, enregistrer, compter plusieurs choses à la fois) ou a besoin de break, écrivez le foreach.
Questions fréquentes
Comment obtenir la clé et la valeur dans une boucle foreach PHP ?
Utilisez la forme => : foreach ($array as $key => $value) { echo "$key: $value"; }. Sur une liste simple, la clé est l'index (0, 1, 2) ; sur un tableau associatif, c'est la clé de type chaîne, comme 'name'.
Comment obtenir l'index dans une boucle foreach PHP ?
Pour une liste, la clé est déjà l'index : foreach ($items as $i => $item). Pour un tableau associatif, gérez votre propre compteur : $i = 0; avant la boucle et $i++ à la fin de chaque passage. array_key_first() et array_key_last() indiquent quelle clé est la première ou la dernière.
Comment modifier les valeurs d'un tableau dans un foreach en PHP ?
Bouclez par référence avec & : foreach ($prices as &$price) { $price *= 2; } unset($price);. Ou écrivez via la clé : foreach ($prices as $key => $price) { $prices[$key] = $price * 2; }. Un simple $price = ... ne modifie qu'une copie.
Pourquoi un foreach PHP par référence duplique-t-il le dernier élément ?
Après foreach ($arr as &$v), $v reste une référence vers le dernier élément. Un second foreach ($arr as $v) écrit alors chaque valeur dans ce dernier emplacement, qui finit par répéter l'avant-dernière valeur. Appelez unset($v); juste après la boucle par référence.
Comment sortir d'une boucle foreach en PHP ?
break; arrête la boucle immédiatement et continue; passe à l'élément suivant. Dans des boucles imbriquées, break 2; quitte à la fois la boucle intérieure et la boucle extérieure.