Très souvent, le travail principal avec un tableau consiste à exécuter des itérations pour traiter chacun des éléments du tableau. Comme à son habitude, PHP propose plusieurs méthodes pour exécuter des boucles, et le choix du bon type de boucle dépend du type de tableau à traiter.

Une boucle exécutée avec foreach est particulièrement utile avec un tableau associatif. Tous les éléments du tableau sont traités sans que nous ayons besoin d'en connaître la clé.

foreach est utilisable aussi avec tous les tableaux à indices numériques, surtout dans le cas où nous ne pouvons pas garantir que les indices du tableau sont bien des entiers consécutifs.

Il existe 4 syntaxes de l'instruction foreach.

### Accès en consultation aux valeurs

    foreach ($tableau as $valeurElt) {
    	instructions
    }

Avec cette syntaxe, à chaque itération, $valeurElt reçoit une copie de la valeur de l'élément courant. Donc, si on modifie $valeurElt, cette modification n'est pas répercutée dans le tableau parcouru.

Exemple : foreach consultation valeur
<?php require('bib_fonctions.php'); htmlDebut('Boucle avec foreach'); htmlInfo('foreach avec un tableau associatif'); $ta['B41d'] = 'Pierre'; $ta['C24a'] = 'Paul'; $ta['D12z'] = 'Jacques'; foreach ($ta as $valeurElt) { echo '<br>Valeur = ', $valeurElt; } htmlInfo('foreach avec un tableau à trous'); $ti[0] = 50; $ti[3] = 60; $ti[6] = 407; foreach ($ti as $valeurElt) { echo '<br>++$valeurElt = ', ++$valeurElt; } echo '<pre>', print_r($ti, true), '</pre>'; htmlFin(); ?>

### Accès en consultation aux clés et aux valeurs

    foreach ($tableau as $cle => $valeurElt) {
    	instructions
    }

Avec cette syntaxe, à chaque itération, $valeurElt reçoit toujours une copie de la valeur de l'élément courant, et $cle reçoit également une copie de valeur de la clé de l'élément courant.

Exemple : foreach consultation clé et valeur
<?php require('bib_fonctions.php'); htmlDebut('Boucle avec foreach'); htmlInfo('foreach avec un tableau associatif'); $ta['B41d'] = 'Pierre'; $ta['C24a'] = 'Paul'; $ta['D12z'] = 'Jacques'; foreach ($ta as $cle => $valeurElt) { echo '<br>Clé = ', $cle, ' | Valeur = ', $valeurElt; } htmlInfo('foreach avec un tableau à trous'); $ti[0] = 50; $ti[3] = 60; $ti[6] = 407; foreach ($ti as $cle => $valeurElt) { echo '<br>++$cle = ', ++$cle, ' | ++$valeurElt = ', ++$valeurElt; } echo '<pre>', print_r($ti, true), '</pre>'; htmlFin(); ?>

### Accès en consultation et en modification aux valeurs

Pour accéder en consultation et en modification aux valeurs, on peut utiliser 2 syntaxes.

La première :

    foreach ($tableau as &$valeurElt) {
    	instructions
    }

Avec cette syntaxe, à chaque itération, $valeurElt reçoit une référence sur la valeur de l'élément courant. Donc, si on modifie $valeurElt, la valeur de l'élément courant est modifiée dans le tableau parcouru.

Exemple : foreach modification valeur (1ère syntaxe)
<?php require('bib_fonctions.php'); htmlInfo('foreach avec un tableau à trous'); $ti[0] = 50; $ti[3] = 60; $ti[6] = 407; foreach ($ti as &$valeurElt) { echo '<br>++$valeurElt = ', ++$valeurElt; } unset($valeurElt); echo '<pre>', print_r($ti, true), '</pre>'; htmlFin(); ?>

La deuxième :

    foreach ($tableau as $cle => &$valeurElt) {
    	instructions
    }

Avec cette syntaxe, à chaque itération, $valeurElt reçoit toujours une référence sur la valeur de l'élément courant, et $cle reçoit une copie de la valeur de la clé de l'élément courant. Donc, si on modifie $valeurElt, la valeur de l'élément courant est modifiée dans le tableau parcouru.

Exemple : foreach modification valeur (2ère syntaxe)
<?php require('bib_fonctions.php'); htmlInfo('foreach avec un tableau à trous'); $ti[0] = 50; $ti[3] = 60; $ti[6] = 407; foreach ($ti as $cle => &$valeurElt) { echo '<br>++$cle = ', ++$cle, ' | ++$valeurElt = ', ++$valeurElt; } unset($valeurElt); echo '<pre>', print_r($ti, true), '</pre>'; htmlFin(); ?>

Notez la présence de l'instruction unset($valeurElt); dans les deux exemples précédents qui permet de détruire la référence sur la valeur du dernier élément du tableau. Sans cette instruction, si on modifie $valeurElt après la boucle, on modifie la valeur du dernier élément du tableau, ... la plupart du temps sans le souhaiter ! Donc, faîtes attention à ne pas oublier le unset($valeurElt);.

### Modification du tableau parcouru lors d'un accès en consultation

Lorsqu'on utilise une boucle foreach sans mettre un & devant $valeurElt, si on modifie "directement" le tableau parcouru dans la boucle, une copie du tableau est effectuée et les modifications ne sont pas visibles dans la boucle.

Attention à l'utilisation de ce mécanisme si vous utilisez foreach avec des tableaux de grande taille car la copie occupe de la place en mémoire.
Exemple : boucle avec modification
<?php require('bib_fonctions.php'); htmlDebut('Boucle avec modification'); $t['B41d'] = 'Pierre'; $t['C24a'] = 'Paul'; $t['D12z'] = 'Jacques'; htmlInfo('Tableau originel'); infoTableau($t); htmlInfo('foreach : accès en consultation'); foreach ($t as $cle => $val) { if ($val == 'Pierre'){ $t['C24a'] .= 'o'; unset($t['D12z']); } echo '<br>Clé = ', $cle, ' | Valeur = ', $val; } htmlInfo('Tableau après la boucle'); infoTableau($t); htmlFin(); ?>