Les boucles - Les clefs du PHP

Qu’est-ce qui identifie un langage comme langage de programmation ? La
boutade est de répondre que ce sont les boucles et nous ne sommes pas
loin de la vérité. Vous êtes sûr de les utiliser dans vos programmes et bien
souvent, elles seront au coeur de vos algorithmes.

Les boucles permettent d’exécuter un bloc d’instructions autant de fois
qu’il est nécessaire. On utilise un index initialisé qui s’incrémente à
chaque boucle. Dans l’intitulé, on insère une condition de sortie de boucle.

La boucle while
while (expression est vrai){
Bloc instruction
}

Vous pouvez utiliser une expression déjà initialisée ou en créer une avec
une nouvelle variable numérique (en général, on l’appelle i comme
index). Quand vous utilisez un index, il faut obligatoirement trois
composantes : la valeur initiale, la valeur limite à partir de laquelle la
valeur n’est plus vraie et la valeur d’incrémentation ou de décrémentation.


Nous allons localiser la variable pour que vous saisissiez le moment où
elle sort de la boucle. Prenons, par exemple, une personne condamnée à
douze jours de prison. Elle rentre le 1er mai et sort le 12. Nous utiliserons
une boucle while. Tant que la variable est dans la boucle, le prisonnier est
incarcéré et la sortie de la boucle correspond à sa levée d’écrou :

 Boucle while : while.php
<?
$i=1;
$temps=12; //premier jour de tôle!!!
while ($i<$temps){
echo "le $i";
if ($i==1){
echo "<sup>er</sup>";
/*cette balise représente la position supérieure en puissance,
pour celle en indice qui est en une position inférieure,
utilisez <sub></sub>*/
}
echo " mai, je suis <B>en prison</B>!\".<br>";
//mettons le en gras
$i++;
// Oubliez cette ligne et vous générez une boucle infinie
}
echo "<br><b>le $i mai</b>, <i>Je suis <B>libéré</B>!</i>";
//enfin je suis libre!!!
?>

http://programmationdebutant.blogspot.com/
Une boucle while

La boucle do…while
Cette boucle est la même que la boucle while mais à la différence de
while, elle initie un tour avant d’entrer dans la boucle, que la condition
soit vérifiée ou non, car la valeur est testée en fin de boucle. On l’emploie
peu mais elle est utile parfois pour décrémenter ou incrémenter une limite
avant une boucle.

Notre prisonnier récidive. Il est condamné par le juge do … et gardé par
le surveillant while. Ici, la boucle est parcourue au moins une fois sans
que la condition ne soit testée :

Boucle do… while : do_while1.php
<?
$i=1;
$temps=12;
do {
echo "le $i";
if ($i==1){
echo "<sup>er</sup>";
}
echo " juin, je suis <B>en prison</B>!\".<br>";
// c’est le mois suivant
$i++;
/*Si vous oubliez cette ligne, vous générez une
boucle infinie */
}
while ($i<$temps);
echo "<br><b>le $i juin</b>, <i>Je suis <B>libéré</B>!.</i>";
?>

Il aurait dû subir sa peine mais imaginons que le voleur ait indemnisé la
victime, il entame un recours mais le temps que la justice tranche... Nous
initialisons la variable à 17, le jour de son entrée :

Boucle do… while : do_while2.php
<?
$i=17; //il entre le 17 juin en prison
$temps=0;
do {
echo "le $i";
if ($i==1){
echo "<sup>er</sup>";
}
echo " juin, je suis <B>en prison</B>!\".<br>";
// c’est le mois suivant
$i++;
//Si vous oubliez cette ligne, vous générez une boucle infinie
}
while ($i<$temps);
echo "<br><b>le $i juin</b>, <i>Je suis <B>libéré</B>!.</i>";
?> 
 

Il passe au moins un jour en prison avec le juge do … et le surveillant
while, alors qu’il n’en passerait aucun avec le juge while.

En général, avec une valeur d’index, il est préférable d’utiliser la boucle
for, faite sur mesure, comme nous le voyons ci-dessous.

La boucle for
 for utilise un compteur qu’elle initialise, limite et incrémente afin
d’exécuter son bloc d’instructions. Elle concentre les trois lignes séparées
par des points-virgules à l’intérieur de sa parenthèse :

for (initialisation ; limite ; incrémentation){
Bloc d’instructions
}

Notre calendrier bancal va vous permettre de comprendre les possibilités
de cette boucle for. Nous allons afficher les années bissextiles qui ont
pour particularité de contenir 366 jours. Le calendrier occidental actuel, le
calendrier grégorien, a été institué en 1582 par le pape Grégoire. Pour
l’heure d’été, nous verrons plus loin dans le chapitre. Une année est
bissextile si elle est divisible par 4. Les années de siècle comme 1900 ou
2000 sont bissextiles si elles sont divisibles par 400. Nous allons utiliser
l’opérateur % (modulo) pour vérifier si l’année est divisible par 4 et le
siècle par 400.

Comme vous le voyez, nous initialisons le calendrier à l’an 1582 :

Les années bissextiles1 : bissextile1.php
<?
for ($an=1582;$an<2020;$an++){
if ($an%100==0){
if ($an%400==0){
echo "$an<br>";
}
}
elseif ($an%4==0){
echo "$an<br>";
}
} ?>
m
 

http://programmationdebutant.blogspot.com/
Les années bissextiles
 Le calendrier maya est plus régulier et plus précis mais il ne nous aurait
pas permis de vous montrer toutes ces subtilités, comme il n’aurait pas
permis à Michèle Morgan, née un 29 février, de dire qu’elle vieillit quatre
fois moins vite que la normale.

Il est possible d’ajouter un autre indice dans la boucle for. Ainsi, si nous
voulons donner le nombre de jours depuis l’an 1582, ajoutons une variable
$j avec une virgule. Elle représente le nombre de jours à partir du premier
janvier 1583 :

Les années bissextiles2 : bissextile2.php
for ($an=1582,$j=0;$an<2020;$an++,$j=$j+365){
// remarquez les virgules
//vous pouvez aussi mettre $j+=365 à la place de $j=$j+365
if ($an%100==0){
if ($an%400==0){
$j++;
echo "$an : $j jours<br>\n";
}
}
elseif ($an%4==0){
$j++;
echo "$an : $j jours<br>\n";
}
} ?>
 

 Foreach
La boucle foreach n’existe qu’à partir de PHP4. Dans PHP3, vous
utiliserez les fonctions each … list. foreach est utilisé pour parcourir
les tableaux et en extraire les clefs et les valeurs. Pour vous montrer un
exemple, nous prendrons les dix premiers départements français :

$departements=array(’01’ => ’Ain’, ’02’ => ’Aisne’, ’03’ => ’Allier’,
’04’ => ’Alpes de Haute Provence’, ’05’ => ’Hautes Alpes’, ’06’ =>
’Alpes Maritimes’, ’07’ => ’Ardèche’, ’08’ => ’Ardennes’, ’09’ =>
’Ariège’, ’10’ => ’Aube’);

Voici donc un nouvel opérateur pour créer un tableau =>. Cet opérateur est
spécifique aux tableaux et lie la clé à sa valeur. Notez que ’01’ n’est pas
un indice numérique mais une chaîne de caractères. Si nous avions écrit
’1’, cette clé aurait été interprétée comme un indice numérique par PHP.

 Maintenant, nous allons l’afficher :

Les départements : departements.php
foreach($departements as $clef=>$valeur){
echo "$clef => $valeur<br>\n";
}
 
Si vous ne voulez afficher que la valeur :
 
foreach($departements as $valeur){
echo " $valeur<br>\n";
//Nous avons ajouté \n pour que le code source soye plus beau!
}
 

 Le traitement générique d’un formulaire
Dans cette partie qui explique la boucle foreach et each… list,
profitons-en pour créer une application très simple afin de traiter un
formulaire.

Le moteur PHP, quand les données d’un formulaire sont envoyées vers
un fichier PHP, crée un tableau. Si vous utilisez la méthode GET, ce seraun
tableau nommé $HTTP_GET_VARS, pour la méthode POST, ce sera $HTTP
_POST_VARS. Pour envoyer les données, il suffit de faire une boucle sur le
tableau :

while(list($clef, $valeur)=each($HTTP_POST_VARS)){
$message.= "$clef : $valeur\n";
}
mail ("$votre_email","RESULTATS DU FORMULAIRE",
"$message","from: monsite.com");

ou avec foreach en HTML :

foreach($HTTP_POST_VARS as $clef=>$valeur){
$message.= "$clef : $valeur<br>\n";
}
mail ("$votre_email","RESULTATS DU FORMULAIRE",
"$message","from: monsite.com");

Vous recevrez toutes les données du formulaire. Si certaines sont inutiles,
il vous suffit d’ajouter dans la boucle :

Traitement pour tout formulaire :
traitement_form_generic.php
if ($clef="submit" || $clef="method"){
continue;
}

Break et continue
break permet de sortir de la boucle et continue perpétue la boucle en
coupant l’exécution du bloc pendant le tour courant.

break permet de s’abstenir de limite supérieure dans la parenthèse de for
car c’est break qui fixe cette limite à 2020 :

 Les années bissextiles3 : bissextile3.php
<?
for ($an=1582; ;$an++){
/* ici nous laissons la limite supérieure en blanc car
l’instruction break va nous faire sortir de la boucle
quand $an est égal à 2021 */
if ($an==2021){
break;
}
elseif ($an%100==0){
if ($an%400==0){
echo "$an<br>";
}
}
elseif ($an%4==0){
echo "$an<br>";
}
} ?>

Reprenons l’exemple étudié dans la partie sur la boucle for. Au lieu de
faire une condition pour inscrire l’année bissextile, nous allons définir
une condition pour court-circuiter cette instruction avec la commande
continue :

Les années bissextiles4 : bissextile4.php
<?
for ($an=1582;$an<2020;$an++){
if ($an%100==0){
if ($an%400>0){
/////////si l’année n’est pas divisible par 400//
continue;
}
}
elseif ($an%4>0){
///ni par 4
continue;
}
echo "$an<br>";
} ?>

Aucun commentaire:

Enregistrer un commentaire