Le stockage et la manipulation d'un grand nombre de données
nécessitent souvent l'utilisation de tableaux.
17.1 Qu'est-ce qu'un tableau ?
Pour simplifier, voici 3 définitions équivalentes :
-
c'est une variable qui peut stocker plusieurs valeurs à la
fois, chacune étant numérotée ;
- OU : c'est un ensemble de variables différentes, regroupées
sous le même nom, chacune étant différenciée des autres par un
numéro ;
- OU : c'est la représentation informatique d'un vecteur (ou
d'une matrice), chacune des composantes étant connue par son indice.
D'une manière plus générale :
-
Un tableau est d'abord une variable, donc son nom commence par
« $ ».
- La syntaxe est la même que dans la plupart des langages :
« $x[$j] » désigne le « $je » élément du tableau
« $x ».
Attention : en PHP la numérotation des éléments d'un tableau
commence toujours à zéro.
17.2 Quelques exemples d'utilisation
17.2.1 Remplir et afficher le contenu un tableau
On peut remplir, par exemple, les cases d'un tableau une par une :
$t[0]="bonjour";
$t[1]="bonsoir";
$t[2]="bla bla bla";
On peut aussi utiliser une boucle for pour remplir une série
de cases :
for ($i=3 ; $i<8 ; $i++) {
$t[$i]=$i*5;
}
Pour ce qui de l'affichage, on est obligé de passer aussi par les cases
une par une : l'utilisation de « echo $t; » ne permet pas
d'afficher le contenu du tableau.
echo "case numéro 2 : ".$t[2]."<BR>\n";
for ($i=2 ; $i<6 ; $i++) {
echo "case numéro $i : ".$t[$i]."<BR>\n";
}
17.2.2 Un exemple complet
En regroupant les lignes précédentes (et en les habillant un peu) on
obtient le programme suivant :
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-01.php
<HTML><BODY>
<H2>Remplissage du tableau</H2>
(Il ne se passe rien à l'écran dans cette partie :
normal, c'est du travail sur la modification des variables,
par sur leur affichage.)
<?php
$t[0]="bonjour";
$t[1]="bonsoir";
$t[2]="bla bla bla";
for ($i=3 ; $i<8 ; $i++) {
$t[$i]=$i*5;
}
?>
<H2>Affichage de certaines cases particulières</H2>
<?php
echo "case numéro 2 : ".$t[2]."<BR>\n"
."case numéro 5 : ".$t[5]."<BR>\n";
?>
<H2>Affichage d'une suite de cases</H2>
<?php
for ($i=2 ; $i<6 ; $i++) {
echo "case numéro $i : ".$t[$i]."<BR>\n";
}
?>
</BODY></HTML>
17.2.3 Un exemple moins élémentaire
Il existe d'autres façons de remplir un tableau.
Commencez par trouver l'aide sur la fonction
« explode »
(c'est une fonction de manipulation de chaînes de caractères) et sur
la fonction
« count »
(c'est une fonction de manipulation de tableaux).
Testez ensuite ce programme :
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-02.php
<HTML><BODY>
<FORM ACTION="tableau-02.php">
<INPUT SIZE="60" NAME="saisie">
<INPUT TYPE="submit" VALUE="Traiter">
</FORM>
<HR>
Les mots de la chaîne tapée sont :
<UL>
<?php
$mots = explode(" ",$saisie);
for ($i=0; $i<count($mots); $i++) {
echo "<LI>".$mots[$i];
}
?>
</UL></BODY></HTML>
17.2.4 Et avec des fichiers ?
On a un fichier de données :
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-03.txt
il contient les informations suivantes :
Thor;Aipaleur;12 Rue Yves Atrovite;59118;Wambrechies
Helmut;Ardalpic;25 Avenue Yann Akpourlui;29000;Quimper
Jacques-André;Lejouré-Lanuit;5 Boulevard Agathe Zepower;92230;Gennevilliers
Gédéon;Teuzmany;123 Rue Alphonse Danltas;59650;Villeneuve d'Ascq
Hakim;Ainerve;2 Rue Yvon Anchier;59830;Cysoing
Thérèse;Ultasonnul;99 Avenue Sophie Fonfec;13000;Marseille
Il s'agit de renseignements portant sur une liste de personnes. Chaque
ligne est sous la forme « prénom ; nom ; adresse
; code postal ; ville » (séparés par des
points-virgules).
Commencez par trouver l'aide sur la fonction
« file »
(c'est une fonction de manipulation de fichiers).
Le programme suivant va lire le fichier et afficher de manière propre
son contenu :
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-03.php
<HTML><BODY><OL>
<?php
// lecture du fichier et stockage dans un tableau
// (chaque ligne du fichier est dans une case du tableau)
$lignes = file("tableau-03.txt");
// traitement de chaque ligne
for ($i=0; $i<count($lignes); $i++) {
// éclatement en éléments distincts
$personne=explode(";",$lignes[$i]);
// affichage "propre" des renseignements
echo "<LI>".$personne[0]." ".strtoupper($personne[1])."<BR>"
.$personne[2]."<BR>".$personne[3]." ".$personne[4];
}
?>
</OL></BODY></HTML>
17.3 Les tableaux associatifs
Il s'agit d'une généralisation des tableaux, mais au lieu d'utiliser
des nombres pour les indices on peut utiliser n'importe quoi...
On peut avoir ainsi une variante de l'exemple précédent. Ce programme
(tableau-04.php) permet de choisir un prénom dans une liste
déroulante et d'afficher les renseignements correspondants.
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-04.php
<HTML><BODY>
<FORM ACTION="tableau-04.php">
<SELECT NAME="prenom">
<OPTION VALUE="Thècle">Thècle
<OPTION VALUE="Édith">Édith
<OPTION VALUE="Kelly">Kelly
<OPTION VALUE="Mélusine">Mélusine
<OPTION VALUE="Elmer">Elmer
</SELECT>
<INPUT TYPE="submit" VALUE="renseignements">
</FORM>
<?php
$nom["Thècle"]="Assicmonpote";
$nom["Édith"]="Avuleur";
$nom["Kelly"]="Diocy";
$nom["Mélusine"]="Enfaillite";
$nom["Elmer"]="Hitmieux";
$adresse["Thècle"]="123 rue Alex KUZBIDON";
$adresse["Édith"]="951 rue Ondine OUCESOIR";
$adresse["Kelly"]="5 boulevard Rosa REMECITOYENS";
$adresse["Mélusine"]="7 rue Jean TANLAMER";
$adresse["Elmer"]="99 avenu Dino ZORE";
$ville["Thècle"]="Rennes";
$ville["Édith"]="Douarnenez";
$ville["Kelly"]="Auchel";
$ville["Mélusine"]="Chamonix";
$ville["Elmer"]="Langres";
if (isset($prenom)) {
echo "Prénom : $prenom<BR>\nNom : ".$nom[$prenom]
."<BR>\nAdresse : ".$adresse[$prenom]
."<BR>\nVille : ".$ville[$prenom];
}
?>
</BODY></HTML>
17.4 Parcours d'un tableau associatif
Quand on travaille avec un tableau classique (à indice numérique), il
est facile d'en parcourir toutes les cases avec une boucle
for.
Mais pour parcourir un tableau associatif, c'est un peu moins direct.
La méthode classique ne marche pas : la fonction count ne
donne pas un résultat exploitable facilement dans le cas d'un tableau
associatif. Il est alors difficile d'imaginer, par exemple pour
l'exemple précédent, une boucle qui construirait automatiquement la
suite « Thècle, Édith, Kelly, Mélusine, Elmer ».
Ces valeurs, il faut aller les chercher dans le tableau lui-même.
Ne nous énervons pas, PHP fournit tout ce qu'il faut. Commencez par
trouver l'aide sur les fonctions
« reset »,
« each »
et
« list »
(ce sont des fonctions de manipulation de tableaux).
Étudiez ensuite le programme suivant.
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-05.php
<HTML><BODY><TABLE BORDER>
<?php
$nom["Thècle"]="Assicmonpote";
$nom["Édith"]="Avuleur";
$nom["Kelly"]="Diocy";
$nom["Mélusine"]="Enfaillite";
$nom["Elmer"]="Hitmieux";
reset($nom);
while (list($clef,$valeur)=each($nom)) {
echo "<TR><TD>$clef</TD><TD>$valeur</TD></TR>\n";
}
?>
</TABLE></BODY></HTML>
Ce programme parcourt le tableau $nom, et en affiche le
contenu, chaque ligne d'affichage contenant le couple clef-valeur (la
clef correspondant à ce qu'on a l'habitude d'appeler indice quand il
s'agit d'un nombre).
17.5 Exercices
-
On dispose du fichier suivant contenant des adresses web (rien
en vous empêche d'en choisir d'autres).
Écrire un programme qui lit ce fichier pour construire une page web
contenant une liste de liens hypertextes.
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-06.txt
http://www.hoaxbuster.com/
http://www.gazel.nu/faqs/virus.htm#e-mail
http://www.electriccafe.org/JBT/
http://www.zetetique.ldh.org/
http://perso.wanadoo.fr/jean.brissonnet/
http://www.thejackytouch.com/
http://www.multimania.com/lepoulpe
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-06.php
- Même exercice, mais cette fois chaque ligne comprend aussi une
description du site pointé (la séparation étant assuré par la chaîne
« "**" ») :
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-07.txt
http://www.hoaxbuster.com/**HoaxBuster, première....
http://www.gazel.nu/faqs/virus.htm#e-mail**Est-il....
http://www.electriccafe.org/JBT/**Nemo Joe Bar Team Spirit
http://www.zetetique.ldh.org/**Le cercle Zététique
http://perso.wanadoo.fr/jean.brissonnet/**Éthique et toc
http://www.thejackytouch.com/**The Jacky Touch
http://www.multimania.com/lepoulpe**Le poulpe sur la toile
Ce qui donne ça : http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-07.php
- Même exercice, mais cette fois chaque description et l'adresse
correspondante sont sur deux lignes consécutives :
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-08.txt
HoaxBuster, première ressource francophone sur les hoax
http://www.hoaxbuster.com/
Est-il possible d'attraper un virus en ouvrant un e-mail?
http://www.gazel.nu/faqs/virus.htm#e-mail
Nemo Joe Bar Team Spirit
http://www.electriccafe.org/JBT/
Le cercle Zététique
http://www.zetetique.ldh.org/
Éthique et toc
http://perso.wanadoo.fr/jean.brissonnet/
The Jacky Touch
http://www.thejackytouch.com/
Le poulpe sur la toile
http://www.multimania.com/lepoulpe
Ce qui donne ça : http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-08.php
- On donne une liste de personnes
dans le fichier http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-09.txt
dont voici les premières lignes :
19;Thor;Aipaleur;tata
30;Dick;Sionnaire;dsds
35;Debbie;Zoudanlkou;dzdz
47;Mélanie;Zaitofrai;mzmz
48;Helmut;Ardelpic;haha
49;Jacques-André;Lejouré-Lanuit;jljl
68;Phil;Alapate;papa
Chaque ligne est composée, dans l'ordre, d'un identifiant (un
nombre), un prénom, un nom, et un mot de passe. Écrire une page web
qui donne à sélectionner une des personnes et qui affiche ensuite
son mot de passe.
http://www.grappa.univ-lille3.fr/polys/reseaux-DG/exemples/tableau-09.php