Tableaux et fichiers Licence AES AGE D.Gonzalez Mars 2004
Table des matières 1 Les tableaux 2 1.1 Qu est-ce qu un tableau?................................ 2 1.2 Quelques exemples d utilisation............................. 2 1.2.1 Remplir et afficher le contenu un tableau................... 2 1.2.2 Parenthèse algorithmique : la boucle for................... 3 1.2.3 Des exemples moins élémentaires........................ 3 1.2.4 Et avec des fichiers?............................... 5 1.3 Exercices......................................... 5 2 Les fichiers 7 2.1 Manipulations de base.................................. 7 2.1.1 Ouverture (et fermeture) d un fichier...................... 7 2.1.2 Écrire dans un fichier.............................. 7 2.1.3 Lire le contenu d un fichier........................... 7 2.2 Un exemple........................................ 8 2.3 Exercice.......................................... 9 1
Chapitre 1 Les tableaux Le stockage et la manipulation d un grand nombre de données nécessitent souvent l utilisation de tableaux. 1.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 «$j e» élément du tableau «$x». Attention : en PHP la numérotation des éléments d un tableau commence toujours à zéro. 1.2 Quelques exemples d utilisation 1.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 : $i=3 ; while ($i<8) { $t[$i]=$i*5 ; $i=$i+1 ; 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"; $i=2 ; while ($i<6) { echo "case numéro $i : ".$t[$i]."<br>\n"; 2
$i=$i+1; Remarque. Il existe aussi la fonction «array» qui permet de constuire un tableau. Par exemple l instruction $t = array( "abcd", 13, 12.8, $henri + $marcel, gfd ) ; aura le même effet que la suite d instructions $t[0] = "abcd" ; $t[1] = 13 ; $t[2] = 12.8 ; $t[3] = $henri + $marcel ; $t[4] = gfd ; 1.2.2 Parenthèse algorithmique : la boucle for Vous avez sans doute remarqué que l accès à un tableau nécessite presque toujours l utilisation d une boucle while. Ceci est dû au fait que les tableaux sont des juxtapositions de données, souvent identiques dans leurs formes, et dont sur lesquelles on applique souvent le même traitement. La boucle de traitement classique des éléments N (inclus) à P (exclus) d un tableau $t sera donc : $i = N ; while ($i < P ) { traitement de $t[$i] $i = $i+1 ; Il existe en PHP une façon plus concise d écrire ce genre de boucle : la boucle for : for ( $i=n ; $i<p ; $i=$i+1 ) { traitement de $t[$i] La boucle for n est en fait qu une abbréviation d un type particulier de boucle while. Écrire for ( A ; B ; C ) { D est totalement la même chose qu écrire A while ( B ) { D C Remarque. On écrira souvent «$i++» à la place de «$i=$i+1». 1.2.3 Des exemples moins élémentaires 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). Comprenez maintenant comment fonctionne ce programme (pas très utiles, il faut bien le reconnaître) : //-------------------- $chaine="ab cde fgh ijk"; 3
$mots = explode(" ",$chaine); echo "$chaine :\n<ul>\n"; for ($i=0;$i<count($mots);$i++) { echo "<LI>".$mots[$i]."\n"; echo "</UL>\n"; //-------------------- $chaine="à la claire fontaine m en allant promener..."; $mots = explode(" ",$chaine); echo "$chaine :\n<ul>\n"; for ($i=0;$i<count($mots);$i++) { echo "<LI>".$mots[$i]."\n"; echo "</UL>\n"; //-------------------- $chaine="ceci est une phrase avec des mots. Normal, non?"; $mots = explode(" ",$chaine); echo "$chaine :\n<ul>\n"; for ($i=0;$i<count($mots);$i++) { echo "<LI>".$mots[$i]."\n"; echo "</UL>\n"; //-------------------- </UL></BODY></HTML> Et celui-ci (toujours aussi peu utile) : $liste=array( "ab cde fgh ijk", "À la claire fontaine m en allant promener...", "Ceci est une phrase avec des mots. Normal, non?" ); for ($j=0; $j<count($liste); $j++) { $chaine=$liste[$j]; $mots = explode(" ",$chaine); echo "$chaine :\n<ul>\n"; for ($i=0;$i<count($mots);$i++) { echo "<LI>".$mots[$i]."\n"; echo "</UL>\n"; </BODY></HTML> Maintenant testez (et comprenez) ce programme : <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> 4
$mots = explode(" ",$saisie); for ($i=0; $i<count($mots); $i++) { echo "<LI>".$mots[$i]; </UL></BODY></HTML> 1.2.4 Et avec des fichiers? On a un fichier de données : 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 : <OL> // 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> 1.3 Exercices 1. 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.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 5
2. 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.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 3. On donne une liste de personnes 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 affiche cette liste d une mamière propre. Variante : Écrire une page web qui donne à sélectionner une des personnes et qui affiche ensuite son mot de passe. 6
Chapitre 2 Les fichiers Un fichier (ou file en anglais, ou document dans le monde Windows) est l objet qui permet à un système d exloitation (donc aussi aux programmes qu il supporte) d enregister des informations sur le disque dur (ou la disquette). 2.1 Manipulations de base Pour utiliser des fichiers il faut savoir les écrire et les relire. 2.1.1 Ouverture (et fermeture) d un fichier Avant tout accès à un fichier il faut l ouvrir, ce qui se fait par la fonction «fopen» dont la syntaxe est : int fopen (string fichier, string mode) où : int signifie que la fonction renvoie une valeur entière. fichier est le nom du fichier à ouvrir. mode décrit la façon dont le fichier sera utilisé. Les valeurs les plus courantes sont : r : Ouvre en lecture seule, et place le pointeur de fichier au début du fichier. w : Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n existe pas, on tente de le créer. a : Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier n existe pas, on tente de le créer. Un fichier ouvert par «fopen» sera fermé par «fclose». 2.1.2 Écrire dans un fichier Nous n étudierons que les fichiers de texte. Mais vous trouverez plus d information sur les fichiers dans l aide de PHP, par exemple à l adresse : http://fr.php.net/manual/fr/html/ref.filesystem.html Pour écrire dans un fichier de texte il faut utiliser la fonction «fwrite» (ou la fonction «fputs» qui est en tous points identique). 2.1.3 Lire le contenu d un fichier Deux solutions radicalement différentes : «file» qu on a déjà vue dans le chapitre sur les tableaux, et qui lit le fichier en une seule fois en le rangeant dans un tableau. «fgets» qui lit le fichier ligne par ligne, et qui impose donc un certain contrôle. 7
Il existe d autres façons de lire les informations rangées dans un fichier mais nous ne les aborderons pas. Comme précédemment vous trouverez plus d information sur les fichiers dans l aide de PHP, par exemple à l adresse : http://fr.php.net/manual/fr/html/ref.filesystem.html 2.2 Un exemple Nous allons réaliser un mini-site qui permet d ajouter une ligne à la fois dans un fichier, tandis qu une page permettra d afficher le contenu du fichier. 1. Formulaire : fichier-01.php <FORM ACTION="fichier-02.php"> Saisie : <INPUT NAME="ligne"> <INPUT TYPE="submit"> </FORM> </BODY></HTML> Il s agit en fait d une simple page HTML contenant un formulaire. 2. Traitement du formulaire (écriture dans le fichier) : fichier-02.php // ouverture du fichier "fichier-04.txt en mode "a" (append=ajout) // l identifiant renvoyé est $fp // il sera utilisé pour l écriture et la fermeture $fp = fopen ("fichier-04.txt","a"); // écriture de la valeur reçue (plus une fin de ligne) fputs ($fp,$ligne."\n"); // fermeture du fichier fclose ($fp) Le fichier a été modifié. </BODY></HTML> Attention : Pour que ce programme fonctionne il faut qu il ait les droits en écriture sur le fichier fichier-04.txt. Ce programme ne devrait pas être laissé en accès libre sur le réseau : n importe qui peut l utiliser et remplir le disque en écrivant dans le fichier sans contrôle. 3. Affichage du contenu du fichier : Première solution, avec la fonction file : fichier-03.php $f=file("fichier-04.txt"); for ($i=0;$i<count($f);$i++) { echo $f[$i]."<br>"; </BODY></HTML> Deuxième solution (pour information, la première étant plus simple), avec la fonction fgets : fichier-04.php 8
$fp = fopen ("fichier-04.txt","r"); while ($l=fgets($fp,500)) { echo $l."<br>"; fclose($fp); </BODY></HTML> 2.3 Exercice Écrire un gestionnaire d annuaire téléphonique. Le minimum à atteindre : 1. Une page (formulaire) qui permet de saisir le nom, le prénom et le numéro de téléphone d une personne. 2. L appui sur la touche d envoi enregistre les coordonnées dans un fichier. 3. Une page qui permette de présenter proprement la liste des contacts. Vous avez le choix sur le sens à donner au mot «proprement» : en tableau, en liste, etc. L important est que ce soit lisible. 4. On doit pouvoir passer facilement d une page à l autre : soit des liens entre les pages, soit une page d accueil. Des améliorations possibles, qui ne seront prises en compte que ce qui précède est réalisé : 1. La liste affichée pourra être mise dans l ordre alphabétique (voir la fonction «sort»). 2. On pourra offrir la possibilité de supprimer un contact. 3. On pourra offrir la possibilité de modifier un contact. 9