PHP débutant - Boucles: Introduction

PHP débutant - Boucles: Introduction

Dans ce chapitre, nous allons parler des boucles! Les boucles font partie des structures de contrôle et servent à répéter un certain nombre de fois une action. L'intérêt des boucles est de ne pas ré-écrire le même bloc de code 10 fois de suite si l'on veut l'exécuter 10 fois.

Sommaire :

PHP débutant - Boucles: Introduction

La boucle For
Le premier type de boucles dont nous allons parler est la boucle for! Elle peut se présenter comme ceci:

for( initialisation; condition; incrémentation )
{
bloc d'instruction(s);
}


Quelques petites remarques d'entrée:
- la première ligne de prend pas de ; à sa fin
- comme pour les if, les accolades sont facultatives si le bloc d'instruction ne contient qu'une seule ligne
- les trois paramètres de la boucle (initialisation, condition et incrémentation) sont faculatifs, contrairement aux deux ; qui les séparent...

Mais voyons un exemple qui sera plus clair que tout ceci:

.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
 
<?php
for( $i = 1; $i < 5; $i++ )
  echo
$i . '<br />';
?>

Affiche:
1
2
3
4


La première ligne de la boucle précise que:
- la variable de boucle s'appelle $i et sa valeur initiale vaut 1
- la boucle s'exécutera tant que sa valeur sera plus petite que 5
- à chaque itération (à chaque "tour de la boucle"), sa valeur augmentera de 1

Par variable de boucle, on entend la variable dont la valeur est modifiée à chaque étape de la boucle et qui sert à savoir quand la boucle doit se terminer; notez au passage quand dans des cas plus complexes, on peut en avoir plusieurs.

La valeur initiale de la variable de boucle peut être fixée en dehors de la boucle. De même que l'incrémentation peut être réalisée dans la boucle. Faites tout de même attention, si vous oubliez d'incrémenter la variable, vous vous retrouverez avec une boucle qui va s'exécuter un nombre infini de fois (enfin... jusqu'à ce que la limite de temps soit dépassée), ce qui sera, dans bien des circonstances, gênant ;) . En rédigeant un des exemples de ce tutoriel, j'ai créé, tout seul et comme un grand, un petit bout de code qui a saturé ma ram ; alors ne faites pas comme moi ;) .

L'exemple que je vous ai présenté plus haut peut donc se ré-écrire comme suit:
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
 
<?php
$i
= 1; // initialisation de la variable de boucle

for( ; $i < 5; ) // le premier et le dernier paramètre ne sont pas donnés
{ // comme on a plusieurs instructions, on met des accolades
 
echo $i . '<br />';
 
 
$i++; // incrémentation de la variable de boucle
}
?>


Pour ceux à qui l'écriture $i++ ferait peur sachez que $i++ est une écriture raccourcie pour $i = $i + 1, qui peut aussi s'écrire $i += 1 ; rien de méchant, donc...

J'ai choisi de faire une incrémentation par pas de 1 avec une variable dont la valeur grandit, mais on pourrait très bien faire diminuer la valeur de la variable de deux à chaque itération, voyez plutôt:
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
 
<?php
for( $i = 7; $i > 0; $i -= 2 )
  echo
$i . '<br />';
?>

Affiche:
7
5
3
1


Ici, initialement, la variable vaut 7. A chaque étape, on diminue sa valeur de 2, ceci tant que sa valeur est plus grande que 0. Voilà pourquoi cet exemple affiche les chiffres 7, 5, 3 et 1.

Dans les exemples précédents, j'ai choisi d'appeler les variables de boucle $i, mais ce choix est arbitraire et la variable de boucle peut être n'importe quelle variable, y compris $ma_variable_de_boucle. Cependant, dans de nombreux langages de programmation, on utilise $i comme variable de boucle (pour des boucles simples) ; ce n'est qu'une convention et ne saurait être obligatoire, mais cela permet de se retrouver facilement dans des scripts rédigés par d'autres personnes. La variable $j est, elle aussi, souvent utilisée.
For et les tableaux
L'un des intérêt des boucles est le parcourt et le traitement des tableaux.

Prenons, pour commencer ce tableau en exemple :
$array = array( 1, 1, 2, 3, 5, 8, 13 );

Nous pourrions afficher à l'écran toutes ses valeurs comme ceci :
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
 
<?php
for( $i = 0; $i < 7; $i++ )
  echo
$array[ $i ] . '<br />'; // ici on accède au $ième élément du tableau
?>

Affiche:
1
1
2
3
5
8
13


Je profite de l'occasion pour vous rappeler que le premier élément d'un tableau a l'indice 0 ; comme ce tableau a 7 éléments, on le parcourt de 0 à 6.

J'ai mentionné plus haut, lors de l'introduction à la boucle for, que nous pouvions écrire une boucle sans savoir combien de fois elle allait s'exécuter, et c'est ce que nous allons voir ici.

La nombre d'élément d'un tableau est donné par la fonction count (), on peut donc écrire :
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
 
<?php
$max
= count( $array ); // $max = nombre d'éléments de $array
for( $i = 0; $i < $max; $i++ )
  echo
$array[ $i ] . '<br />';
?>

Affiche:
1
1
2
3
5
8
13


Remarquez qu'il vaut mieux faire comme j'ai fait ici (définir $max avant la boucle), que de faire for( $i = 0; $i < count( $array ); $i++ ) car, dans cette version, à chaque itération de la boucle, count( $array ) est calculé, ce qui rallongerait le temps d'exécution du script pour rien.

Le tableau que j'ai utilisé contient les 7 premiers termes de la suite de Fibonacci, voici comment cette suite se construit:
- les deux premiers éléments valent 1: 1, 1
- le troisième vaut la somme des deux premiers: 1, 1, 2
- le quatrième vaut la somme du deuxième et du troisième: 1, 1, 2, 3
- si F(n) représente le énième terme de la suite, on a: F(n) = F(n-2) + F(n-1) (un terme est la somme des deux termes précédents).

Nous allons donc créer un tableau contenant les deux premiers termes et calculer les 10 suivants, puis afficher le tout!
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
 
<?php
// départ
$array = array( 1, 1 );

// boucle de création de la suite
for( $i = 2; $i < 12; $i++ )
 
$array[ $i ] = $array[ $i - 2 ] + $array[ $i - 1 ]; // création du nouvel élément
 
// affichage
$max = count( $array ); // nombre d'éléments d'$array
for( $i = 0; $i < $max; $i++ )
  echo
$array[ $i ] . '<br />'; // affichage d'un élément
?>




Imbrication de boucles
Tout comme les autres éléments de langage, les boucles peuvent être imbriquées! On pourrait créer une jolie table de multiplication comme ceci :
.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
 
<?php
for( $i = 1; $i <= 10; $i++ )
{
// début de la première boucle
 
echo '| '; // début de ligne

 
for( $j = 1; $j <= 10; $j++ )
  {
// début de la seconde boucle
   
echo $i * $j . ' | ';
  }
// fin de la seconde boucle
 
 
echo '<br />'; // fin de ligne
} // fin de la première boucle
?>

Affiche:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
| 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 |
| 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 40 |
| 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 |
| 6 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 60 |
| 7 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 70 |
| 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 | 80 |
| 9 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 | 90 |
| 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |


J'aimerais vous rendre attentif sur quelques points:
- pour commencer, si vous imbriquez deux boucles, chacune s'exécutant 20 fois, le nombre de fois que le contenu de la deuxième boucle sera exécuté sera égal à 400 ; si vous faites la même chose avec 3 boucles, on arrive à 8000, ... Imbriquer des boucles amène souvent beaucoup d'opérations, il faut donc veiller à le faire que lorsque l'on en a besoin et réfléchir à ce que l'on fait.
- expérience faite, on confond facilement les différentes variables de boucles... Ce qui amène des résultats surprenants.

On pourrait ré-écrire l'exemple précédant pour que l'affichage soit plus joli. Par exemple, si le résultat de la multiplication est plus petit que 10, on pourrait ajouter deux 0 devant, et 1 si le résultat est plus grand ou égal à 10 mais plus petit que 100. Ensuite, on pourrait ajouter des # en haut de la première et en bas de la dernière ligne. Prêt?

Allons-y! :)
.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
.32
.33
.34
.35
.36
.37
.38
.39
.40
.41
.42
.43
.44
.45
.46
.47
 
<?php
for( $i = 0; $i <= 11; $i++ ) // on va cette fois ci de 0 à 11
{ // début de la première boucle
 
 
if( $i && $i != 11 ) // si ce n'est ni la première ni la dernière ligne , équivalent à if( $i != 0 && $i != 11 )
   
echo '| ';
  else
// si on est dans la première ou la dernière ligne
   
echo '####';

  for(
$j = 1; $j <= 10; $j++ )
  {
// début de la seconde boucle
 
   
if( !$i || $i == 11 ) // si $i vaut 0 ou 11 (première ou dernière ligne)
     
echo '####';
    else
// sinon, on va faire la multiplication
   
{
     
$produit = $i * $j; // on calcule le produit
     
     
if( $produit < 10 ) // si le produit < 10
       
echo '00' . $produit . ' | '; // on met 2 "0" devant
     
else if( $produit < 100 )
        echo
'0' . $produit . ' | '; // on met 2 "0" devant
     
else
        echo
$produit . ' | ';
    }
   
  }
// fin de la seconde boucle

 
 
echo '<br />';
}
// fin de la première boucle
?>

Affiche:
############################################
| 001 | 002 | 003 | 004 | 005 | 006 | 007 | 008 | 009 | 010 |
| 002 | 004 | 006 | 008 | 010 | 012 | 014 | 016 | 018 | 020 |
| 003 | 006 | 009 | 012 | 015 | 018 | 021 | 024 | 027 | 030 |
| 004 | 008 | 012 | 016 | 020 | 024 | 028 | 032 | 036 | 040 |
| 005 | 010 | 015 | 020 | 025 | 030 | 035 | 040 | 045 | 050 |
| 006 | 012 | 018 | 024 | 030 | 036 | 042 | 048 | 054 | 060 |
| 007 | 014 | 021 | 028 | 035 | 042 | 049 | 056 | 063 | 070 |
| 008 | 016 | 024 | 032 | 040 | 048 | 056 | 064 | 072 | 080 |
| 009 | 018 | 027 | 036 | 045 | 054 | 063 | 072 | 081 | 090 |
| 010 | 020 | 030 | 040 | 050 | 060 | 070 | 080 | 090 | 100 |
############################################