PHP débutant - Boucle While

PHP débutant - Boucle While

Après une petite excursion du côté de foreach, spécialement dédiée aux tableaux, je vous propose de revenir aux boucles plus simples. Nous allons donc étudier while, une boucle toute simple, ne prenant qu'un paramètre et très utilisée en programmation.
Sommaire :

PHP débutant - Boucle While

La boucle While
La boucle while est une boucle très simple, elle se présente de la manière suivante:

while( condition )
{
bloc instruction(s);
}

Ainsi, tant que condition est vérifiée, la boucle s'exécute. Cette manière de fonctionner entraîne deux choses:
- si condition est fausse avant la boucle, celle-ci ne sera pas exécutée
- si la condition change durant l'exécution de la boucle, celle-ci ne s'interrompra qu'à la fin de l'itération

Ici, comme d'habitude, les accolades sont facultative si bloc instruction(s) ne contient qu'une seule instruction.

Essayons de reproduire le premier exemple du paragraphe sur les boucles for: il affichait les chiffres de 1 à 4.

.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
.16
 
<?php
$i
= 1; // initialisation de la variable de boucle

while( $i < 5 )
{
  echo
$i . '<br />'; // affichage
 
$i++; // incrémentation
}
?>

Affiche:
1
2
3
4


Il ne faut pas oublier de déclarer la variable de boucle avant la boucle, sous peine d'avoir un message d'erreur (selon les serveurs) et un comportement étrange de la boucle.

De la même façon, on pourrait parcourir notre petit tableau "fibonnaccien":
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
.16
.17
.18
.19
.20
.21
.22
 
<?php
$array
= array( 1, 1, 2, 3, 5, 8, 13 );

$i = 0;
$max = count( $array );

while(
$i < $max )
{
  echo
$array[ $i ] . '<br />';
 
$i++;
}
?>

Affiche:
1
1
2
3
5
8
13


Nous avons pris ici comme condition des tests sur des entiers, mais ne pourrions faire autre chose! Nous allons utiliser les fonction strpos et substr pour l'exemple suivant.

- strpos( $chaine, $lettre ) renvoie la position de la première occurrence de $lettre dans la chaine $chaine ou false si la lettre n'est pas trouvée.
- substr( $chaine, $start, $length ) renvoie $length caractères de $chaine après la position $start

Ce que nous allons faire c'est prendre un petit texte et le découper: chaque fois que nous trouverons la lettre p, nous allons afficher le début du texte jusqu'à cette lettre et recommencer jusqu'à ce que l'on ne trouve plus la lettre dans le texte... Oui, j'avoue que c'est confus, mais regardons ce que cela donnerait pour la phrase: "Je me demande si mon papa aime les pirogues" .
Notre (futur) code appliqué à cette phrase afficherait:
Je me demande si mon p
ap
a aime les p
irogues

Nous sommes bien d'accord sur le fait que ce code ne sert strictement à rien, si ce n'est à faire un exemple de code! :)

Voilà comment il va fonctionner:
- Pour commencer, nous allons définir la chaine de caractère qui sera notre texte ( $texte )
- Ensuite viendra la boucle dont la condition sera '$texte contient-il un p' ?
1° Si oui, on va afficher le texte jusqu'à ce p et $texte vaudra le texte initial moins ce début
2° Si non, on va afficher la fin du texte

Voici le code:
.01
.02
.03
.04
.05
.06
.07
.08
.09
.10
.11
.12
.13
.14
.15
.16
.17
.18
.19
 
<?php
// texte
$texte = 'Je me demande si mon papa aime les pirogues';

while( (
$pos = strpos( $texte, 'p' ) ) !== false ) // si le texte contient un p, c'est-à-dire, si $pos est différent de false
{
  echo
substr( $texte, 0, ( $pos + 1 ) ) . '<br />'; // on affiche le début jusqu'au p trouvé
 
$texte = substr( $texte, ( $pos + 1) ); // on enlève le début du texte jusqu'au p trouvé
} // fin de la boucle, on peut recommencer

echo $texte; // affichage du dernier bout
?>

Affiche:
Je me demande si mon p
ap
a aime les p
irogues


Examinons les quelques lignes qui peuvent poser problème:
- $pos = strpos( $texte, 'p' ) , $pos contient donc la position de p ou false s'il ne reste plus de p dans $texte. La raison pour laquelle on utilise !== et pas != c'est que $pos peut valoir 0 si un p se trouve au début du texte: si on utilisait != et que $pos vaut 0, cela ferait comme s'il ne restait plus de p dans le texte. Pour plus d'informations sur !==, regardez les opérateurs de comparaison dans les chapitres réservés aux if!

Passons aux exemples, dans ce bout de code on affiche ( $pos + 1 ) caractères depuis le caractère 0 (donc le début) de $texte :
.01
.02
.03
.04
.05
.06
 
<?php

   
echo substr( $texte, 0, ( $pos + 1 ) ) . '<br />';

?>


Maintenant on enlève les caractères que l'on a affiché, c'est à dire qu'on récupère les caractères depuis la position ( $pos + 1 ) jusqu'à la fin (comme on ne spécifie pas le troisième paramètre pour substr, PHP ira jusqu'à la fin de la chaine.
.01
.02
.03
.04
.05
.06
 
<?php

    $texte
= substr( $texte, ( $pos + 1) ). '<br />';

?>


Voilà pour cet exemple. Même si cela vous semble encore un peu confus, vous trouverez vous-même des utilisations des boucles et le meilleur moyen de les combiner pour arriver à vos fins! J'ajouterai pour terminer que même si je n'ai pas donné d'exemple plus complexes, vous êtes libre de faire beaucoup de chose, notamment en ce qui concerne la condition: comme pour les tests conditionnels, vous pouvez utiliser && et || afin de rendre vos tests plus élaborés. Le meilleur moyen d'apprendre ce genre de chose est de faire des tests et de jouer avec toutes les structures que nous voyons ensemble au travers de ces tutoriels.