COURS PHP

  Dernière mise à jour effectuée le : Vendredi 15 août 2003    

Accueil | Les tableaux indexés à deux dimensions

Les tableaux indexés à deux dimensions
Je sais (par expérience) que la notion de tableau à deux dimensions est plus difficile à appréhender comme concept pour certaines ou certains auditeurs. Surtout si on n'a jamais programmé de sa vie. Mais vous allez voir qu'en fait, c'est extrêmement simple.



Principe

Nous avons déjà vu ce qu'était un tableau à une dimension (un vecteur) dont l'image la pus approchante est celle d'un meuble de rangement de CD audios tout en hauteur, avec un casier pour chaque disque. Pour celles et ceux qui n'auraient pas vu cette leçon, allez la voir.
Maintenant, imaginez que vous mettiez plusieurs de ces meubles les uns à côté des autres. Jusqu'à en recouvrir votre mur (nous n'irons pas jusque là, mais on pourrait). Vous auriez en face de vous un tableau à deux dimensions.
Si vous donnez des numéros à chaque meuble (1, 2, 3 etc.) et également des numéros aux casiers dans chaque meuble, vous aurez un tableau indexé à deux dimensions . Pour retrouver un disque particulier, il vous faudra dire :
"Je veux le disque qui est dans le meuble numéro tant, casier numéro tant".
Impossible de se tromper. C'est clair, précis et rigoureux. La seule chose, c'est qu'il vous faudra juste donner un nom à cet assemblage pour pouvoir le déclarer à PHP. Appelons-le $Discotheque par exemple. Vous voulez bien ? Oui... ? Bon !C'est parfait. On peut continuer.

 



Déclaration d'un tableau à deux dimensions

Comme nous l'avons déjà vu dans la leçon sur les tableaux à une dimension (les vecteurs), nous savons que nous pouvons mettre absolument tout ce que l'on veut dans chaque casier de notre tableau. Y compris même un autre tableau. Hé bien c'est exactement comme ça qu'on déclare un tableau à deux dimensions.
Si l'on ne sait pas à l'avance ce que l'on va mettre dans chaque casier, on déclare ce tableau de la manière suivante :

$Discotheque = array(array()) ;

Ecrire ça, signifie pour PHP : "tu crée un tableau qui s'appellera $Discotheque et dedans, tu y mets un autre tableau".
Il nous restera à les remplir le moment venu, mais ça peut attendre. Dès que nous avons déclaré ce tableau à deux dimensions, PHP a réservé en mémoire, un espace suffisant pour y recevoir n'importe quoi. Il gère le contenu de manière dynamique, c'est-à-dire qu'il occupera autant de place que nécessaire au fur et à mesure que nous remplirons notre tableau.

 



Remplissage d'un tableau indexé à deux dimensions

Il faut d'abord avoir déclaré notre tableau comme indiqué dans le paragraphe précédent par l'instruction :

$Discotheque = array(array()) ;

Maintenant, remplissons le. Ceci peut se faire tout de suite après avoir déclaré le tableau, ou n'importe quand dans le cours de notre programme.
Si l'on suppose que le premier meuble de notre discothèque (donc d'indice zéro puisque c'est le premier) sera rempli avec les disques classiques, pour remplir les casiers (postes) de ce tableau, il faudra écrire (par exemple) :

$Discotheque[0][0] = "Mozart" ;
$Discotheque[0][1] = "Chopin" ;
$Discotheque[0][2] = "Haendel" ;
$Discotheque[0][3] = "Bach" ;
$Discotheque[0][4] = "Lully" ;
$Discotheque[0][5] = "Gounod" ;
$Discotheque[0][6] = "Schbert" ;
$Discotheque[0][7] = "Brahms" ;
$Discotheque[0][8] = "Verdi" ;
$Discotheque[0][9] = "Wagner" ;

Remarquez que l'on met d'abord le numéro du meuble (tableau) entre crochets, puis le numéro du casier (poste) dans ce meuble, toujours entre crochets. Ainsi, le premier meuble (je rappelle que par défaut il porte le numéro zéro, comme d'habitude), sera équivalent à notre maintenant célèbre $MeubleClassique.

Maintenant, disons que dans notre deuxième meuble (celui d'à côté) nous classions des disques de jazz. Ce deuxième meuble, tout contre le premier, aura l'indice 1 puisque c'est le deuxième. Nous le remplirons de la manière suivante (par exemple) :

$Discotheque[1][0] = "Louis Armstrong" ;
$Discotheque[1][1] = "Baden Powell" ;
$Discotheque[1][2] = "Art Tatum" ;
$Discotheque[1][3] = "Nat King Cole" ;
$Discotheque[1][4] = "Claude Bolling" ;
$Discotheque[1][5] = "Fats domino" ;
$Discotheque[1][6] = "Billie Holiday" ;
$Discotheque[1][7] = "Lionel Hampton" ;
$Discotheque[1][8] = "Keith Jarrett" ;
$Discotheque[1][9] = "Benny Goodman" ;

Notez que maintenant, c'est l'indice 1 qui représente ce deuxième meuble (entre les premiers crochets). Alors que les numéros des casiers, eux ne changent pas. Il vont de 0 à 9, comme pour le premier (entre les deuxièmes crochets).
J'ai mis autant de disque dans l'un que dans l'autre, mais ça n'est en aucun cas une obligation. Vous pouvez en mettre plus, moins, le même nombre, peu importe. Après tout, on n'est pas obligé d'avoir autant de disque d'un genre que d'un autre hein ? Heureusement !

Si vous avez un troisième meuble (donc d'indice 2), à côté des deux autres, collé à eux, et que vous y classiez vos disques de chanteurs d'opéra, vous écririez :

$Discotheque[2][0] = "Théo Adam" ;
$Discotheque[2][1] = "Fischer Dieskau" ;
$Discotheque[2][2] = "Jules Bastin" ;
$Discotheque[2][3] = "Ileana Cotrubas" ;
$Discotheque[2][4] = "José Carreras" ;
$Discotheque[2][5] = "Enrico Caruso" ;
$Discotheque[2][6] = "Placido Domingo" ;

Remarquez l'indice 2 en première position entre crochets qui désigne votre troisième meuble, alors que les incides des casiers de ce meuble varient comme les autres. Notez également qu'il ne contient pas autant de postes que les deux premiers, mais ça n'a strictement aucune importance. On peut faire ce que l'on veut. J'aurais même pu ne pas remplir des casiers contigus, mais laisser des trous. Ca marche aussi.

Bon ! Nous nous arrêterons là pour le moment. Je crois que vous avez compris comment ça fonctionne et c'est le principal.

 



Accéder aux contenus des postes d'un tableau à deux dimensions

Une fois notre tableau rempli, il ne nous reste plus qu'à nous en servir. Ca signifie avoir accès aux contenus de chaque postes. Dans un tableau de ce genre, indexé (donc repéré par des numéros), pour aller chercher un disque particulier, il faut que l'on sache deux choses : dans quel meuble il se trouve, et dans quel casier de ce meuble. En langage informatique, ça veut dire connaître l'indice du tableau et l'indice du poste de ce tableau.

Par exemple pour aller chercher le disque de Lionel Hampton, qui se trouve dans le deuxième meuble (le jazz) et dans le huitième casier de ce meuble, il faudra écrire :

$DisqueA_Ecouter = $Discotheque[1][7] ;

Notez que le numéro du meuble est "1" puisque c'est le deuxième et que tout comence à zéro, et que le deuxième indice est "7" puisque c'est le huitième disque, pour la même raison.
Ce qui est peu pratique pour nous humains, dans cette notation, c'est qu'il faut retenir des numéros. Mais ce qui est pratique pour un ordinateur, c'est que grace à ces numéros, on pourra parcourir tous les meubles et tous les casiers en faisant simplement deux boucles "for" imbriquées et en se servant des indices de ces boucles pour accéder aux indices des meubles et des casiers. Par exemple en écrivant le petit programme suivant :

// liste de tous les disques :

for($NumMeuble = 0; $NumMeuble<= 2; $NumMeuble++) { // boucle sur les meubles
     for($NumDisque = 0; $NumDisque <= 10; $NumDisque++) {// boucle sur les disques
          echo $Discotheque[$NumMeuble][$NumDisque] ."<br>"; // écriture à l'écran du contenu
     } // fin boucle sur les meubles
} // fin boucle sur les disques

Vous obtiendrez l'affichage suivant :

Mozart
Chopin
Haendel
Bach
Lully
Gounod
Schubert
Brahms
Verdi
Wagner

Louis Armstrong
Baden Powell
Art Tatum
Nat King Cole
Claude Bolling
Fats domino
Billie Holiday
Lionel Hampton
Keith Jarrett
Benny Goodman

Théo Adam
Fischer Dieskau
Jules Bastin
Ileana Cotrubas
José Carreras
Enrico Caruso
Placido Domingo

Notez que dans la boucle sur les disques, qui va jusqu'à 10, on a allègrement dépassé le nombre de disques du troisième meuble. Mais ça ne dérange pas outre mesure PHP, qui, si le casier (voire le meuble) n'existe pas dans la discothèque, n'affiche tout simplement rien et ne renvoie aucun message d'erreurs comme on aurait été en droit de s'y attendre. C'est en même temps pratique, et en même temps dangereux, car si on a une erreur dans notre programme, on ne sera pas averti lors d'un dépassement d'indice dans un tableau. Je suis allé jusqu'à 10 et non pas 9 dans l'indice des disques, pour avoir une ligne vide de séparation entre les meubles.

En ce qui concerne l'affichage par les fonctions print_r() ou var_dump() ou implode(), allez voir Affichage du contenu des tableaux indexés à deux dimensions.

 



Ajout et modification des contenus des postes

L'ajout et la modification des postes d'un tableau indexé à deux miemesions se fait très exactement de la même manière que pour un tableau indexé à une dimension. Voir la leçon correspondante.

Simplement, il faudra donner le numéro du meuble et le numéro du casier. En français, les indices des deux tableaux. Par exemple pour rajouter le prénom de "Wagner" (Richard) qui se trouve dans le tableau d'indice 0 (le premier) et dans le casier d'indice 9 (le huitième) de ce tableau, il faudra écrire :

$Discotheque[0][9] = "Richard Wagner" ;

et le tour est joué.

Pour rajouter une chanteuse à notre meuble des chanteurs d'opéra, il faudra écrire :

$Discotheque[2][7] = "Teresa Berganza" ;

en lui attribuant un numéro disponible. On peut sauter des cases, je le rappelle. Si on se trompe et qu'on donne un numéro de poste existant, la nouvelle valeur viendrait "écraser" l'ancienne. Attention !

 



Ce cours est enseigné par Philippe Médan 
dans le cadre de la formation des professionnels de l'INTERNET.
au CREFAC , 14 rue Scandicci, 93000 Pantin. Tél. : 01 48 46 51 99
au GITA-GRETA , Lycée Technologique Diderot 61, rue David D'Angers 75019 Paris Tél. : 01 40 40 36 27
au CESI à l'Ecole des ingénieurs, 116 Av Aristide Briand, BP 57, 92224 Bagneux CEDEX Tél. : 01 45 36 70 00

© Philippe Médan 1999-2003. Tous droits de reproduction réservés pour tous pays.