Les conditions permettent d'exécuter des instructions selon certaines conditions, la structure conditionnelle la plus utilisée est "if/else". Cependant, il existe deux alternatives très pratiques dans des cas particuliers : Switch et l'opérateur ternaire.
-
L'instruction "if / else if / else" (si, sinon)
La syntaxe de l'instruction "if" prend la forme suivante :
if (expression booléenne) {
Instructions ;
}
else if (expression booléenne) { //facultatif, on note "else if" ou "elseif"
Instructions ;
}
else { //facultatif
Instructions ;
}
Lorsque l'expression booléenne prend la valeur true, c'est le premier groupe d'instructions qui est exécuté. Dans le cas contraire, (false), c'est le deuxième groupe d'instructions, situé après le mot-clé "else", qui est exécuté.
L'expression booléenne doit contenir un ou plusieurs opérateurs de comparaison comme :
- $a == $b : $a est égal à $b
- $a === $b : $a est égal à $b et ils sont de même type
- $a != $b : $a est différent de $b
- $a !== $b : $a est différent de $b ou ils ne sont pas du même type
- $a > $b : $a est strictement plus grand que $b
- $a < $b : $a est strictement plus petit que $b
- $a >= $b : $a est plus grand ou égal à $b
- $a <= $b : $a est plus petit ou égal à $b
Pour les variables de type booléen, l'instruction: if ($var1 == true) est équivalente à : if ($var1). Ainsi que l'instruction if ($var2 == false) est équivalente à : if (!$var2).
Remarque : Les accolades "{}" ne sont pas obligatoires quand on a une seule instruction à exécuter dans "if".
Remarque 2 : Il existe une 2ème syntaxe pour l'instruction "if" en PHP, qui n'est pas très populaire, cette syntaxe sert à remplacer l'accolade d'ouverture par deux points (:) et l'accolade de fermeture par "endif". Dans cette syntaxe, on ne peut pas utiliser la notation "else if" mais seulement "elseif" (sans espace):
if (expression booléenne) :
Instructions ;
elseif (expression booléenne) :
Instructions ;
else :
Instructions ;
endif;
Exemple 1 :
<?php
$var_bool = false;
if ($var_bool == false){ // ou bien : if (!$var_bool){
echo "var_bool vaut false";
}
else {
echo "var_bool vaut true";
}
echo "<hr />";
// 2ème méthode (sans accolades) : équivalente à la précédente
if ($var_bool) echo "var_bool vaut true"; // ou bien : if ($var_bool == true)
else echo "var_bool vaut false";
?>
Exemple 2 :
<?php
// *** Le plus grand nombre ***
$a = 3;
$b = 8;
$c = 5;
// Structure imbriquée sans utilisé le bloc : elseif
if ($a > $b){
if ($a > $c){ // $a > $b et $a > $c
echo "Le plus grand est : ".$a;
}
else { // $a > $b et $c > $a
echo "Le plus grand est : ".$c;
}
}
else { // $b > $a
if ($b > $c){ // $b > $a et $b > $c
echo "Le plus grand est : ".$b;
}
else { // $b > $a et $c > $b
echo "Le plus grand est : ".$c;
}
}
echo "<hr />";
// Structure if / else if / else : équivalente à la précédente
if ($a >= $b && $a >= $c) echo "Le plus grand est : ".$a;
else if ($b >= $a && $b >= $c) echo "Le plus grand est : ".$b;
else if ($c >= $a && $c >= $b) echo "Le plus grand est : ".$c;
else echo "Autre chose !";
echo "<hr />";
// Syntaxe alternative : équivalente aussi aux précédentes
if ($a >= $b && $a >= $c) :
echo "Le plus grand est : ".$a;
elseif ($b >= $a && $b >= $c) :
echo "Le plus grand est : ".$b;
elseif ($c >= $a && $c >= $b) :
echo "Le plus grand est : ".$c;
else :
echo "Autre chose !";
endif;
?>
On peut utiliser l'opérateur ternaire à la place de "if / else" quand on veut affecter une valeur à une variable en fonction de cette valeur. La syntaxe est : $var = (expression) ? val1 : val2 ;
Si l'expression est vraie (true), la variable "$var" vaut la valeur "val1", sinon, "$var" vaut "val2".
Exemple :
<?php
if (!empty($_GET['var']) && is_numeric($_GET['var']))
$var = $_GET['var'];
else $var = 0;
echo $var."<br />"; // $var = 5
// Ternaire : équivalente à l'instruction if / else précédente
$var = (!empty($_GET['var']) && is_numeric($_GET['var'])) ? $_GET['var'] : 0 ;
echo $var."<br />"; // $var = 5
?>
Lorsqu'une variable ou une instruction peut prendre une valeur parmi plusieurs choix, alors il est préférable d'utiliser l'instruction "switch" plutôt que plusieurs instructions "if/else" imbriquées. La syntaxe est :
switch(expression) {
case val1 :
instructions ;
break;
case val2 :
instructions ;
break;
case val3 :
...
default:
instructions ;
}
Chaque instruction "case" doit avoir une instruction "break" à la fin, sinon PHP continuera à exécuter toutes les instructions qui suivent.
Remarque : L'instruction "default" est facultative, dont l'action sera exécutée si aucune des conditions évaluées n'a été remplie. Contrairement à l'instruction "case", "default" ne contient pas un "break" à la fin.
Exemple : afficher selon un numéro compris entre 1 et 12 le mois équivalent :
<?php
$mois = 2;
switch($mois) {
case 1 : // ou bien case "1" :
echo "janvier";
break;
case 2 :
echo "février";
break;
case 3 :
echo "mars";
break;
// Jusqu'à case 12 : echo "décembre";
default:
echo "Mois invalide !";
}
?>
Les boucles permettent d'exécuter plusieurs fois une suite d'instructions. Il existe deux types de boucles :
- Les boucles déterministes (for et foreach) : le nombre d'itérations est défini a l'entrée de la boucle ;
- Les boucles indéterministes (while et do-while) : l'exécution de la prochaine itération est conditionnée par une expression booléenne.
La syntaxe de la boucle for est :
for(initialisation ; continuer tant que ; incrémentation) {
instructions ;
}
Exemple : afficher tous les chiffres de 1 à 10 :
<?php
// les accolades ne sont pas nécessaires ici parce qu'il y a une seule instruction dans "for".
for($i=1;$i<11;$i++)
echo $i."-"; // affiche 1-2-3-4-5-6-7-8-9-10-
?>
Il existe deux autres instructions que l'on peut utiliser dans toutes les boucles (for, foreach, while et do-while) :
- L'instruction "break" : permet de sortir d'une boucle
<?php
$nbr = 5;
for($i=1;$i<100;$i++){
if ($i > $nbr)
break ;
echo $i."-"; // affiche 1-2-3-4-5-
}
Ici, la boucle "for" n'affichera pas tous les nombres de 1 jusqu'à 99, mais seulement jusqu'à 5 à cause de l'instruction "break".
- L'instruction "continue" : permet d'éluder les instructions de l'itération courante et de commencer la prochaine itération.
<?php
echo "<hr />";
for($i=0;$i<5;$i++){
if ($i == 2)
continue ;
echo $i."-"; // affiche 0-1-3-4-
}
?>
Dans cet exemple, la boucle "for" n'affiche pas le nombre 2, et elle continue à exécuter les itérations suivantes.
Exemple : afficher les nombres impairs compris entre 0 et 10 :
Les deux exemples suivants affichent exactement le même résultat :
<?php
for ($i=0;$i<=10;$i++){
if ($i % 2) // si le modulo de $i / 2 est différent de 0 (égal à true)
echo $i."-"; // affiche 1-3-5-7-9-
}
echo "<hr />";
for ($i=0;$i<=10;$i++){
if (!($i % 2)) // si le modulo de $i / 2 est égal à 0 (égal à false)
continue ;
echo $i."-"; // affiche 1-3-5-7-9-
}
?>
Pour parcourir les valeurs d'un tableau, on doit utiliser la boucle "for" :
<?php
$semaine=array("lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
for ($i=0;$i<7;$i++)
echo $semaine[$i]."<br />";
?>
Il existe également une boucle plus simple pour parcourir la totalité d'un tableau, c'est la boucle "foreach", cette instruction fonctionne uniquement sur les tableaux, la syntaxe est :
foreach ($tableau as $element) {
instructions ;
}
Exemple : afficher les jours de la semaine :
<?php
$semaine=array("lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
foreach($semaine as $jour)
echo $jour."<br />";
?>
On a déjà parlé des variables superglobales, et on a dit qu'elles sont des tableaux ($_GET, $_POST, $_COOKIE, $_SESSION…). On peut alors afficher toutes les valeurs passées à la page courante via les superglobales en utilisant la boucle "foreach" :
Exemple pour $_GET :
<?php
foreach ($_GET as $index => $valeur)
echo $index." : ".$valeur."<br />";
?>
La syntaxe de la boucle "while" est :
while (continuer tant que) {
instructions ;
}
La boucle "while" exécute les instructions tant que l'expression de la boucle est évaluée comme TRUE. La valeur de l'expression est vérifiée à chaque début de boucle, et, si la valeur change durant l'exécution de l'instruction, l'exécution ne s'arrêtera qu'à la fin de l'itération courante :
Exemple :
<?php
$i = 0;
while($i < 3){
echo $i."-"; // affiche 0-1-2-
$i++; // incrémentation $i = $i + 1
}
?>
Cette boucle se répète 3 fois, on commence par $i = 0;
- $i = 0, est-ce que $i < 3 ? Oui, on écrit "0-" et on incrémente : $i + 1 = 1
- $i = 1, est-ce que $i < 3 ? Oui, on écrit "1-" et on incrémente : $i + 1 = 2
- $i = 2, est-ce que $i < 3 ? Oui, on écrit "2-" et on incrémente : $i + 1 = 3
- $i = 3, est-ce que $i < 3 ? Non, alors PHP ne vas pas exécuter les instructions qui sont dedans.
Exemple : afficher les nombres paires compris entre 0 et 9 :
<?php
$i = 0;
while($i <= 10){
$i++;
if (!($i % 2)) // si le modulo de $i/2 est égal à 0 (égal à false)
echo $i."-"; // affiche 2-4-6-8-10-
}
// Le même exemple + l'instruction "continue"
$i = 0;
while($i <= 10){
$i++;
if ($i % 2) // si le modulo de $i/2 est différent de 0 (égal à true)
continue;
echo $i."-"; // affiche 2-4-6-8-10-
}
// Le même exemple + l'instruction "break"
$i = 0;
while($i >= 0){
$i++;
if (!($i % 2)) // si le modulo de $i/2 est égal à 0 (égal à false)
echo $i."-"; // affiche 2-4-6-8-10-
if ($i > 10)
break;
}
?>
Il ya une seule différence entre les boucles "while" et "do-while", c'est que l'expression de "do-while" est testée à la fin de chaque itération plutôt qu'au début (le cas de "while"). Alors, la première itération de la boucle "do-while" est toujours exécutée (les instructions sont exécutées au moins une fois !). La syntaxe est :
do {
instructions ;
} while (continuer tant que) ;
Exemple :
<?php
$i = 1;
do {
echo $i."-";
$i++;
} while($i < 3);
?>
Pour mieux comprendre la différence entre "while" et "do-while". On va les tester avec une expression qui égale False depuis le début :
Exemple :
<?php
echo "do-while : ";
$i = 5;
do {
echo $i."-"; // affiche 5-
$i++;
} while($i < 1);
echo "<br />while : ";
$i = 5;
while($i < 1){
echo $i."-"; // n'affiche rien !
$i++;
}
?>
Dans cet exemple, on commence par $i = 5 et on incrémente la valeur de $i, alors l'expression ($i < 1) est toujours FALSE. Malgré ça, "do-while" exécute les instructions la première fois parce que l'expression n'est vérifiée qu'à la fin de la boucle.