PHP débutant - Boucle Foreach

PHP débutant - Boucle Foreach

Dans le tutoriel précédant, nous avons parlé de la boucle for. A travers quelques exemples, nous avons vu comment se servir de cette structure de contrôle et comment parcourir des tableaux avec elle. Maintenant, nous allons parler de foreach (littéralement "pour chaque", c'est-à-dire une exécution de la boucle pour chaque élément d'un tableau), une boucle spécialement dédiée aux tableaux!
Sommaire :

PHP débutant - Boucle Foreach

La boucle Foreach
Pour commencer, reprenons le joli tableau que nous avions défini précédemment:

.01
.02
.03
.04
 
<?php
$array
= array( 1, 1, 2, 3, 5, 8, 13 );
?>


Comme nous l'avons vu, nous pouvons le parcourir à l'aide d'un count (qui donne le nombre d'éléments) et d'une boucle for, mais nous pouvons aussi le faire avec foreach. Foreach se décline en deux versions, examinons d'abord la première:
.01
.02
.03
.04
.05
 
<?php
foreach( $array as $value )
  echo
$value . '<br />';
?>


Ainsi, nous parcourons le tableau $array et la valeur de l'élément courant est copié dans $value, qui est ensuite affiché. Vous ne voyez sûrement aucun avantage à utiliser foreach à la place de for. Mais étudions le cas d'un nouveau tableau:
.01
.02
.03
.04
 
<?php
$array
= array( 'premier' => 'N° 1', 'deuxieme' => 'N° 2', 'troisieme' => 'N° 3');
?>


Contrairement au tableau précédant, les indices des éléments ne sont pas des nombres (0, 1, 2, ...) mais des chaînes de caractères (on appelle un tel tableau un tableau associatif). Ainsi, si je veux accéder au deuxième élément, je dois procéder comme suit: $array['deuxieme'] . Il est donc impossible ici d'utiliser for. Par contre, avec foreach, aucun problème:
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
 
<?php
$array
= array( 'premier' => 'N° 1', 'deuxieme' => 'N° 2', 'troisieme' => 'N° 3');

foreach(
$array as $value ) // on parcourt $array, la valeur de l'item courant est copiée dans $value
 
echo $value . '<br />'; // affichage
?>

Affiche:
N° 1
N° 2
N° 3


La seconde version de foreach permet de connaître, en plus de la valeur de l'élément courant, sa clé:
.01
.02
.03
.04
.05
.06
.07
 
<?php
$array
= array( 'premier' => 'N° 1', 'deuxieme' => 'N° 2', 'troisieme' => 'N° 3');

foreach(
$array as $key => $value )
  echo
'Cet élément a pour clé "' . $key . '" et pour valeur "' . $value . '"<br />';
?>


Dans ce cas, on parcourt le tableau $array et la clé de l'élément courant est copiée dans $key tandis que sa valeur est copiée dans $value!

Cette boucle pourrait nous permettre d'afficher tous les élément du tableau superglobal $_SERVER:
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
 
<?php
foreach( $_SERVER as $key => $value )
  echo
'$_SERVER['' . $key . ''] =' . $value . '<br />';
?>

Affiche:
$_SERVER['HTTP_HOST'] =localhost
$_SERVER['HTTP_USER_AGENT'] =Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1
$_SERVER['HTTP_ACCEPT'] =text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
$_SERVER['HTTP_ACCEPT_LANGUAGE'] =fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
$_SERVER['HTTP_ACCEPT_ENCODING'] =gzip,deflate
$_SERVER['HTTP_ACCEPT_CHARSET'] =ISO-8859-1,utf-8;q=0.7,*;q=0.7
$_SERVER['HTTP_KEEP_ALIVE'] =300
...


Vous remarquerez que l'on ne met pas les [ ] de $_SERVER! Retenez cet exemple de code, il vous permettra un jour d'afficher le contenu de $_POST, $_GET ou encore $_SESSION, ce qui peut parfois s'avérer très utile pour déceler un bug ou une valeur incorrecte dans un script :) .

On peut aussi imbriquer des boucles foreach, regardez comment on peut ainsi afficher le contenu d'un tableau à deux dimensions :
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
.22
.23
.24
.25
.26
.27
.28
.29
.30
.31
 
<?php
$array
= array( 'fruits' => array( 'pommes', 'tomates', 'abricots' ),
               
'animaux' => array( 'chats', 'chiens' ),
               
'pays' => array( 'Suisse', 'France', 'Angleterre' ) );

foreach(
$array as $key => $value )
{
  echo
$key . ': <br />';
 
  foreach(
$value as $valeur )
    echo
'  ' . $valeur . '<br />';
   
  echo
'<br />';
}
?>

Affiche:
fruits:
  pommes
  tomates
  abricots

animaux:
  chats
  chiens

pays:
  Suisse
  France
  Angleterre


Le premier foreach parcourt le tableau principal, les valeurs de $key sont successivement 'fruits', 'animaux' et 'pays' tandis que $value contient le tableau qui contient les exemples, c'est donc $value que l'on prend comme tableau pour le deuxième foreach!