Les expressions conditionnelles et les boucles
Introduction
Nous avons vu les différents opérateurs utilisables en php.
Nous allons maintenant voir les expressions et boucles dans lesquelles se retrouvent généralement ces opérateurs.
Les expressions conditionnelles
Ces tests permettent de tester la validité des expressions et, en fonction du résultat vrai ou faux, d'effectuer les opérations adéquates.
Ces tests sont des éléments très importants dans la réussite d'un programme.
Si vous vous trompez les effets peuvent etre catastrophiques. Un OU mis à la place d'un ET dans une expression de test et patatra ...
if
Ce test permet de réaliser une action en fonction de l'état vrai ou faux de l'expression.
if(expression) {
actions1 réalisées si le résultat de l'expression est vrai
}
else {
actions2 réalisées si le résultat de l'expression est faux
}
exemple
<HTML>
<?
if("$code" == "987654")
{
print "
<META HTTP-EQUIV=REFRESH CONTENT=\"6;URL=http://www.monsite.com/entreevalide.php\">
<BODY BGCOLOR=#FFFFFF> <CENTER>
<IMG SRC=IMAGES/ok.gif>
<BR>
<FONT SIZE=5>
Bonjour votre mot de passe est valide<BR>
vous allez bientôt pouvroir accéder à notre<BR>
zone privée<BR>
</FONT>
";
}
else
{
print "
<META HTTP-EQUIV=REFRESH CONTENT=\"6;URL=http://www.monsite.com/erreur.php\">
<BODY BGCOLOR=#FFFFFF> <CENTER>
<IMG SRC=IMAGES/erreur.gif>
<BR>
<FONT SIZE=5>
Bonjour votre mot de passe est erroné<BR>
veuillez entrez un mot de passe valide<BR>
</FONT>
";
}
?>
<BODY>
</HTML>
En fonction du choix de l'utilisateur vous obtiendrez donc deux pages différentes qui redirigeront au bout de 6 secondes vers la page indiquée dans la ligne META ...
Le test
if propose deux actions en fonction de la valeur de l'expression vraie ou fausse.
Vous pouvez imbriquer des
if permettant ainsi de réaliser des actions en fonction de plus de deux critères. Le problème est que la lisibilité devient vite impossible.
if(){}else{if()else{...}}
Vous pouvez alors utilisez une alternative grace au mot clé
elsif.
if (expression)
{
action1 si la valeur d'expression est vraie
}
elseif (expression2)
{
action2 si la valeur de expression est fausse et si la valeur d'expression2 est vraie
}
elseif (expression3)
{
action3 si la valeur de expression est fausse, la valeur d'expression2 est fausse et si la valeur d'expression3 est vraie
}
......
else
{
actionn si toutes les valeurs des expressions précédentes sont fausses
}
switch
Cette instruction permet de proposer différentes actions en fonction du résultat d'une expression. Vous me direz le
elseif fait la même chose.
En effet dans le cas où vous évaluez toujours le résultat de la même variable (voir exemple précédent), l'expression est toujours la même c'est vrai. Par contre si vous désiriez évaluer différentes expressions, le switch ne peut convenir.
switch (expression) {
case valeur1 : actions1;
break;
case valeur2 : actions2;
break;
...
case valeurn ; actionsn;
break;
default : actions par défaut;
break;
}
Vous voyez que le test ne se fait que sur une expression. En fonction de la valeur de cette expression le programme exécute une des actions.
Le mot clé break permet une fois l'action réalisée de sortir du switch. Si vous ne mettez pas le break, les actions suivantes seront éxécutées.
exemple
<HTML>
<?
switch($type)
{
case "mathematiques" :
print "<meta http-equiv=refresh content=\"6;
URL=qcmmath.html\">";
break;
case "histoire de l art" :
print "<meta http-equiv=refresh content=\"6;
URL=artqcm.html\">";
break;
case "droit" :
print "<meta http-equiv=refresh content=\"6;
URL=droitqcm.html\">";
break;
case "ecologie" :
print "<meta http-equiv=refresh content=\"6;
URL=ecoloqcm.html\">";
break;
case "culture generale" :
print "<meta http-equiv=refresh content=\"6;
URL=cultureqcm.html\">";
break;
default :
print "Si vous ne choisissez rien je fais comment ?";
exit;
}
print "<BODY BGCOLOR=#FFFFFF> <CENTER>
Vous avez choisi le domaine <FONT COLOR=green>$type</FONT>";
?>
<BODY>
</HTML>
Les boucles
Les boucles permettent de répéter les mêmes actions selon la valeur de l'expression indiquée dans le test.
Vous pouvez par exemple, lire le contenu d'un fichier, effectuer des recherches d'occurrence, des opérations mathématiques ...
while
Cette boucle appelée en algorithmique « tant que » permet d'effectuer les mêmes opérations (bloc d'instructions) contenu dans cette boucle tant que la valeur de l'expression est vraie.
Attention le risque de cette boucle est de ne jamais en sortir on appelle cela une boucle infinie. En effet il faut être certain qu'à un moment ou un autre l'expression devienne fausse, si ce n'est pas le cas le bloc d'instructions sera exécuté indéfiniment. Imaginez que ce bloc écrive des informations dans un fichier vous risquez alors la saturation de l'espace disque où se situe ce fichier. Il peut aussi y avoir bien pire comme problème :)
while(expression) {
instructions;
}
exemple
Vous voulez proposer aux internautes les tables de multiplications de leurs choix.
Vous leurs demandez quelle table ils veulent (chiffres à multiplier) et juqu'à quel chiffre il désire le voir multiplier.
Page html proposant le formulaire
<HTML>
<HEAD>
</HEAD>
<BODY BGCOLOR=white>
<font size=4><U>Bienvenue sur le site de Mathématiques Plus</U></font>
</CENTER>
<BR>
<FORM ACTION=while.php METHOD="POST">
<LI><FONT COLOR=green SIZE=3>
Choisissez le nombre dont<BR>
vous désirez la table de multiplication
</FONT>
<UL>
<LI>Donnez le chiffre <INPUT TYPE=TEXT NAME="nombre" SIZE=3>
</UL>
<LI><FONT COLOR=green SIZE=3>Donnez la borne de la table.</FONT>
<BR> (Le nombre doit etre supèrieur à 0)
<UL>
<LI>Donnez la borne <INPUT TYPE=TEXT NAME="borne" SIZE=3>
</UL>
</OL>
<INPUT TYPE=SUBMIT VALUE="Soumettre">
<INPUT TYPE=RESET VALUE="Reset">
</FORM>
</BODY>
</HTML>
Programme php traitant le formulaire précédent
<html>
<?
print "<font size=3>Vous avez demandez la table de <BR>multiplication de
<font color=green>$nombre</font> jusqu'à la borne <font color=green>
$borne</font></font><BR><BR>";
print "<table bgcolor=yellow border=1>";
$cpt=0;
while($cpt <="$borne)
{
$resultat=$nombre*$cpt;
print "<tr>
<td align=center>$nombre * $cpt</td>
<td align=center>=</td>
<td align=center bgcolor=pink>$resultat</td>
<tr>";
$cpt++;
}
?>
</table>
</body>
</html>
Ce programme pour être correct nécessiterait quelques tests de validité des informations entrées par l'utilisateur (borne, chiffre et non caractères ...).
Si vous entrez une borne négative aucun tableau ne sera affiché, on n'entre pas dans la boucle.
Dans le programme php l'expression devient fausse dès que le compteur cpt vaut borne + 1. C'est à ce moment que l'on sort de la boucle. Il a donc fallu avant le début de la boucle initialiser le compteur à 0 et surtout incrémenter ce compteur à l'intérieur de la boucle pour le faire évoluer en lui ajoutant 1 à chaque passage. Si vous oubliez cette instruction dans le bloc du while c'est la boucle infinie ... Le reste n'est que de la mise en forme html.
do ... while
Cette boucle ressemble à la boucle précédente while.
En algorithmique elle se nomme la boucle « jusqu'à ».
A la différence du while, vous exécutez au moins une fois le bloc d'instruction quelque soit la valeur de l'expression. Cette expression n'est évaluée qu'une fois le premier passage réalisé. Le test s'effectue à la fin de la boucle et non au début.
Une fois dans la boucle, les instructions se feront jusqu'à ce que l'expression devienne fausse.
do {
instructions;
}
while(expresion);
exemple
Nous reprenons le même formulaire que précédemment en modifiant seulement la boucle de traitement dans le programme php.
<html>
<?
print "<font size=3>Vous avez demandez la table de <BR>multiplication de
<font color=green>$nombre</font> jusqu'à la borne <font color=green>
$borne</font></font><BR><BR>";
print "<table bgcolor=yellow border=1>";
$cpt=0;
do
{
$resultat=$nombre*$cpt;
print "<tr>
<td align=center>$nombre * $cpt</td>
<td align=center>=</td>
<td align=center bgcolor=pink>$resultat</td>
<tr>";
$cpt++;
}while($cpt <="$borne);
?>
</table>
</body></html>
Vous obtiendrez le même résultat qu'avec le while à la différence prêt que si vous donnez une borne négative vous obtiendrez un tableau comportant une première ligne correspondant à la première valeur du compteur soit la multiplication par 0.
for
Cette boucle permet d'effectuer les instructions du bloc lorsque l'on connaît la valeur de la borne. A la différence du while vous n'avez pas à vous soucier de l'arrêt de la boucle, le compteur s'incrémente de lui-même.
Vous utilisez cette boucle lorsque vous connaissez précisément le nombre de fois où vous voulez passer dans le bloc d'instructions. Vous pouvez éventuellement sortir de la boucle en utilisant une commande break comme dans le cas du switch.
Vous pouvez aussi sauter une itération (un passage dans le bloc d'instruction) grâce à la commande continue. Attention dans ces deux cas la lisibilité de votre programme sera plus difficile.
for (valeur de départ;valeur de fin de boucle;incrément du compteur) {
instructions;
}
- valeur de départ est la première valeur que prend votre compteur
- valeur de fin de boucle est la dernière valeur que prend le compteur (valeur d'arrêt)
- incrément du compteur est la valeur que vous ajoutez à chaque passage au compteur
Reprenons le formulaire précédent et modifions le programme php.
<html>
<?
print "<font size=3>Vous avez demandez la table de <BR>multiplication de
<font color=green>$nombre</font> jusqu'à la borne <font color=green>
$borne</font></font><BR><BR>";
print "<table bgcolor=yellow border=1>";
for($cpt=0;$cpt<="$borne;$cpt++)
{
$resultat=$nombre*$cpt;
print "<tr>
<td align=center>$nombre * $cpt</td>
<td align=center>=</td>
<td align=center bgcolor=pink>$resultat</td>
<tr>";
}
?>
</table>
</body></html>
Vous obtiendrez la même page qu'avec le while.
L'initialisation du compteur et son incrémentation sont inclus dans les instructions de la boucle for et non plus dans le bloc de la boucle.
foreach
Une dernière boucle particulière est foreach qui permet de parcourir le contenu d'une liste ou d'un tableau associatif et d'en extraire les couples clé-valeur (voir la partie
définition de variables).
foreach ($liste as $valeur) {
instructions;
}
ou
foreach ($tableau as $cle=>$valeur) {
instructions;
}
exemple
<html>
<body BGCOLOR=#FFFFFF>
<B><U>La boucle foreach</U><Br><Br><B>
<?
# J'affecte les éléments à ma liste
$liste = array( "4 bougies","cagouille","php4");
# J'affiche le nombre d'éléments de ma liste ainsi que son contenu
$i=0;
print "Etat de la liste <U>avant</U> le tri<BR>";
foreach($liste as $valeur)
{
print "\$liste[$i] vaut <FONT COLOR=green>$valeur</FONT><BR>";
$i++;
}
print "<HR SIZE=8>";
# Essai sur un tableau associatif
$tab = array( "fred"=>"eric", "dom"=>"tom");
print "Le tableau associatif tab contient";
print " <FONT COLOR=green>".count($tab)."</FONT> élements<BR>";
foreach ($tab as $cle=>$valeur)
{
print "\$tab[<FONT COLOR=green>$cle</FONT>] vaut";
print " <FONT COLOR=green>$tab[$cle]</FONT><BR>";
}
?>
</body></html>
Nous vous informons que ce cours constitue une œuvre protégée en France
par le Code de la Propriété Intellectuelle, et à l’étranger par les
conventions internationales en vigueur sur le droit d’auteur. La
violation de l’un des droits d’auteur de l’œuvre est un délit de
contrefaçon.
Il est donc interdit, à titre privé ou public, de reproduire, copier,
vendre, revendre ou exploiter, que ce soit dans un but commercial ou
purement gratuit, ce cours, sauf accord exprès et préalable de son
auteur.