coincoins

Les boucles en PHP

Prérequis : Pour suivre ce cours, vous devez avoir étudié les cours précédents sur le PHP.
Nous verrons ici les boucles for, while et foreach. Ces boucles sont le coeur des programmes, elles servent à lire des tableaux, afficher des listes, attendre une intervention de l'utilisateur, etc. ...
Bonne lecture, bon travail.

Pour, pour lire des tableaux
FOR : la boucle à nombre d'itérations déterminé.

a) La théorie

Cette boucle est souvent utilisée pour faire des comptages, pour parcourir un tableau, pour faire un certain nombre de traitements don le nombre est connu à l'avance.

Exemple : afficher la table de 3 : pour i de 1 à dix, afficher "3*i"=(3*i).
On va compter i de 1 à 10 et afficher le résultat de 3*i à chaque comptage.

Le code correspondant :

<?php
	// Afficher la table de trois
	for ($i=1;$i<=10;$i++) echo "3*$i=".(3*$i)."<br>";
?>
Afficher la table de trois
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27
3*10=30

Bon, d'accord, ça peut aussi servir pour autre chose, par exemple afficher des tableaux et, euh, parcourir des tableaux .. (hé, hé, hm!).

b) L'exemple

Voici un tableau tab de 10 éléments :

indiceVal
0val0
1val1
2val2
3val3
4val4
5val5
6val6
7val7
8val8
9val9
10val10

Puis, ci-dessous, le code qui a permis de l'afficher :

<?php
	// Afficher le tableau
	$nbCell=sizeof($tab); // nombre de cellules
	echo "<table>";
	echo "<tr><th>indice</th><th>Val</th></tr>";
	for ($i=1;$i<=$nbCell;$i++) {
		echo "<tr>";
		echo "<th>$i</th>";// col 1
		echo "<td>".$tab[$i]."</td>";// col 2
		echo "</tr>";
	}
	echo "</table>";
?>
while : la boucle "Tant Que"

C'est la boucle à tout faire. On commence par faire un test et, tant que ce test réussi, on exécute le traiement de la boucle.

1. Généralités

Cette boucle sert surtout à parcourir des listes dont on ne connait pas le nombre de boucles a effectuer au départ : parcourir des fichiers, des requêtes SQL, des tableaux, des chaînes de caractères, etc.

Testons avec l'exemple ci-dessous :

Soit la liste (le tableau) de fruits suivante :

$fruits = array('pomme', 'orange', 'poire', 'cerise', 'carambole', 'banane', 'framboise', 'mirabelle');

Affichons le contenu l'un en dessous de l'autre :

<?php
	$i=0;
	while (isset($fruits[$i]) && $unFruit=$fruits[$i]) {
		echo "$i : ".($unFruit)."<br>";
		$i++;
	}
?>
0 : pomme
1 : orange
2 : poire
3 : cerise
4 : carambole
5 : banane
6 : framboise
7 : mirabelle

l'instruction isset($fruits[$i]) vérifie si le fruit n° $i existe. Cette instruction est souvent utile pour vérifier l'existence d'une variable.
Remarquer aussi les {} (accolades) qui permettent de regrouper les instructions en bloc.

while (bis) : utilisation courante
La boucle while est surtout utilisée pour afficher/traiter les enregistrements d'une table récupérés dans une base de données avec une requête SQL.

Pour cela, on va ouvrir la connexion au serveur, choisir la base, préparer la requête, l'exécuter et tant que la lecture du résultat fonctionne, on va traiter l'enregistrement lu. A la fin, on referme la connexion

Voici le code typique avec mysql. Note : on utilise un objet PDO (Portable Data Object)

Note : Dans ce code, je ne donne pas les valeurs de $server, $user et $password. Chez vous, avec WampServer, vous aurez respectivement les valeurs : 'localhost', 'root' et '' (vide).

Il faut que la table fruits existe. Elle pourra avoir la forme : fruits(id, nom, couleur), clé primaire : id

Ça donne ce résultat :

1 : pomme
3 : orange
3 : poire
4 : cerise
5 : carambole
6 : banane
7 : framboise
8 : mirabelle
// A) connexion à la base de données
	// 1) Initialisation des paramètres
	$dbServer="localhost"; // serveur
	$dbUser="root";        // utilisateur de connexion
	$dbPass="";            // mot de passe (vide!)
	$dbName="maSuperDataBase"; // nom de la BDD
 
	// 2) connexion & ouverture de la base 
	   // (ouais, c'est compliqué, mais quant y faut, y faut).
	$DB = new PDO("mysql:host=$dbServer;dbname=$dbName", $dbUser, $dbPass, 
	   array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
	);
 
// B) Lancement de la requête
	$codeSQL = "SELECT * FROM fruits ;"; // 3) préparation de la requête
	$query_stmt = $DB->query($codeSQL);  // 4) exécution de la requête
 
// C) Traitement des données
	// 5) TANT QUE la liste n'est pas finie
	while ($unEnreg = $query_stmt->fetch(PDO::FETCH_ASSOC)) { 
	  // 6b) traiter l'enregistrement
	  echo $unEnreg['id']." : ".$unEnreg['nom']."<br>"; 
	}
 
	// 7) fermeture de la connexion
	unset($DB);
while (ter) : version "Répéter Tant Que" (rare)
Cette boucle est rarement utilisée mais c'est la seule boucle "répéter" en php.

Si while(condition){instructions} n'exécute aucune action si la condition n'est pas valide dès le début, la boucle, REPETER TANT QUE() va faire au moins 1 traitement avant de se poser la question s'il faut continuer ou pas

 

On l'utilise souvent dans des langages comme le java, le c ou le Powershell pour contrôler la saisie de données au clavier :
Répéter "saisir un nombre" tant que la saisie est incorrecte

 

Elle est écrite avec les instructions do au début et while(); à la fin.
Reprenons l'exemple du tableau de fruits au début du cours :

// répéter ... tant que i<longueur(tableau)
	$i=0;
	do { // répéter
	   echo "$i : ".$fruits[$i]."<br>";
	   $i++;
	}while ($i<=sizeof($fruits)); // tant que ...

Remarquer l'instruction sizeof() pour obtenir la longueur du tableau.

 

 

until : "Répéter JUSQU'A", la boucle qui-n'exite-pas-en-php


credit image : Microsoft MSDN

Attention, ce n'est pas la même qu'avant !!!

La condition de cette boucle est une contition d'arrêt (jusqu'à) et non une condition de continuation (tant que)!!!

Cette condition existe dans quelques langages comme le C, le VB mais pas en PHP ni en Javascript.

Pour le PHP, se reporter à la boucle précédente : répéter-tant-que.

 

Comme dans la boucle précédente, le code est exécuté au moins une fois donc, il faut être attentif aux potentielles erreurs d'initialisation.

 

En VB, la syntaxe est la suivante :

UBound permet de récupérer la longueur du tableau

vbCrLf permet de faire un retour de ligne (cr=carriage return + lf=line feed)

 

Rappel : cette boucle (loop) n'existe pas en php.