COURS PHP

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

Accueil | Les tableaux associatifs à deux dimensions

Les tableaux associatifs à deux dimensions

Leçons à avoir vu avant :



Généralités

Comme nous l'avons déjà vu, il existe des tableaux associatifs à une dimension. Nous savons comment ils fonctionnent. Il existe aussi des tableaux indexés à une et à deux dimensions et nous savons également comment ils fonctionnent.

La différence entre un tableau indexé et un tableau associatif repose uniquement sur le contenu de l'étiquette qui référence le casier (le poste) de chaque tableau. Dans les tableaux indexés, c'est un numérique entier (en français : un chiffre tout bête et tout simple, sans virgule), dans les tableaux associatifs, c'est une chaîne de caractères. Pour le reste il n'y au strictement aucune différence entre les deux.

La différence est purement conceptuelle, car PHP gère les deux très exactement de la même manière. Nous n'allons donc pas passer des heures sur les tableaux associatifs à deux dimension. Mais nous allons quand même les étudier et donner des exemples.

 



Déclaration d'un tableau associatif à deux dimensions

Reprenons notre exemple du tableau associatif à une dimension donnant la traduction Anglais-Français des jours de la semaine. Il se déclarait de la manière suivante :

$JourSemaine = array("Monday" => "Lundi", "Tuesday" => "Mardi", "Wednesday" => "Mercredi", "Thursday" => "Jeudi", "Friday" => "Vendredi", "Saturday" => "Samedi", "Sunday" => "Dimanche") ;

Vous vous souvenez ? Bon ! Maintenant, rajoutons-en un autre, donnant cette fois la traduction des mois de l'Anglais en Français. Nous aurons :

$Mois = array("January" => "janvier", "February" => "février", "March" => "mars", "April" => "avril", "May" => "mai", "June" => "juin", "July" => "juillet", "August" => "août", "September" => "septembre", "October" => "octobre", "November" => "novembre", "December" =>"décembre") ;

Nous voici en présence de deux tableaux associatifs à une dimension (vecteurs). Pour créer un tableau associatif à deux dimensions avec ces deux là, il n'y a qu'à les réunir en un seul tableau (comme nous avons fait pour les meubles de disques) et écrire très simplement :

$TradJoursMois = array("NomJour" => $JourSemaine, "NomMois" => $Mois) ;

$TradJoursMois est le nom que je décide de donner à mon tableau associatif à deux dimensions.
NomJour est le nom que je décide de coller sur l'étiquette du premier poste (casier) de mon grand tableau. Poste qui lui même contient un tableau associatif à une dimension : $JourSemaine. Ce qui s'exprime en disant :
"NomJour" => $JourSemaine
ce qui se traduit pour PHP, par : "tu ouvres un casier sur lequel tu colles l'étiquette "NomJour" et dans ce casier, tu y mets le tableau associatif à une dimension qui s'appelle $JourSemaine". Pareil pour NomMois et $Mois.

Voila. Notre tableau associatif à deux dimensions est créé et rempli. Pour en visualiser le contenu, utilisez la fonction :

print_r($TradJoursMois) ;

et vous obtiendrez le résultat suivant (en mettant cette fonction entre les balises HTML <pre> et </pre>) :

Array
(
    [NomJour] => Array
        (
            [Monday] => Lundi
            [Tuesday] => Mardi
            [Wednesday] => Mercredi
            [Thursday] => Jeudi
            [Friday] => Vendredi
            [Saturday] => Samedi
            [Sunday] => Dimanche
        )

    [NomMois] => Array
        (
            [January] => janvier
            [February] => février
            [March] => mars
            [April] => avril
            [May] => mai
            [June] => juin
            [July] => juillet
            [August] => août
            [September] => septembre
            [October] => octobre
            [November] => novembre
            [December] => décembre
        )

)

Si vous désirez encore plus de précisions, utilisez la fonction (en la mettant entre les balises HTML <pre> et </pre> pour conserver l'indentation ) :

var_dump($TradJoursMois) ;

et vous aurez :

array(2) {
  ["NomJour"]=>
  array(7) {
    ["Monday"]=>
    string(5) "Lundi"
    ["Tuesday"]=>
    string(5) "Mardi"
    ["Wednesday"]=>
    string(8) "Mercredi"
    ["Thursday"]=>
    string(5) "Jeudi"
    ["Friday"]=>
    string(8) "Vendredi"
    ["Saturday"]=>
    string(6) "Samedi"
    ["Sunday"]=>
    string(8) "Dimanche"
  }
  ["NomMois"]=>
  array(12) {
    ["January"]=>
    string(7) "janvier"
    ["February"]=>
    string(7) "février"
    ["March"]=>
    string(4) "mars"
    ["April"]=>
    string(5) "avril"
    ["May"]=>
    string(3) "mai"
    ["June"]=>
    string(4) "juin"
    ["July"]=>
    string(7) "juillet"
    ["August"]=>
    string(4) "août"
    ["September"]=>
    string(9) "septembre"
    ["October"]=>
    string(7) "octobre"
    ["November"]=>
    string(8) "novembre"
    ["December"]=>
    string(8) "décembre"
  }
}

 



Comment remplir un tableau associatif à deux dimensions

Nous venons de voir une première méthode au paragraphe précédent, pour remplir un tableau associatif à deux dimensions lors de sa déclaration. Mais il se peut que nous ayons oublié des choses ou que nous voulions tout simplement y rajouter des trucs au cours de notre programme. Alors là, rien de plus simple. Il suffit tout simplement de le dire.
Par contre, pour rajouter quelque chose au bon emplacement, il faut avoir en mémoire les étiquettes qui référencent, et les tableaux eux-mêmes, et les casiers (postes) de ces tableaux. Comme nous devions avoir les indices en mémoire pour les tableaux indexés.
Par exemple, si nous voulions en plus, dans le même tableau, associer les jours de la semaine en Allemand à leur équivalent Français, en plus de leur traduction Anglaise, il nous faudrait par exemple créer un autre tableau associatif pour l'Allemand (notez qu'il est à l'inverse des autres, et que les clés sont les noms Français cette fois-ci) :

$JourSemaineAll = array("Lundi" => "Montag", "Mardi" => "Dienstag", "Mercredi" => "Mittwoch", "Jeudi" => "Donnerstag", "Vendredi" => "Freitag", "Samedi" => "Samstag", "Dimanche" => "Sonntag" ) ;

Pour ajouter ce nouveau tableau dans $TradJoursMois nous n'aurions qu'à écrire quelque part dans notre programme, en dehors de toute déclaration du tableau (elle est déjà faite) :

$TradJoursMois["NomJourAllemand"] = $JourSemaineAll ;

Le simple fait d'écrire ça, pour un tableau existant (déjà déclaré, rempli ou non) signifie pour PHP : "tu crées un nouveau casier dans $TradJoursMois, tu lui colles une étiquette sur laquelle il sera marqué "NomJourAllemand" et dans ce casier, tu y ranges $JourSemaineAll."
Sachant $JourSemaineAll est lui même un tableau, il va se rajouter à côté des autres
Remarquez que l'on n'utilise plus le signe "=>". Il ne s'utilise que lors de la déclaration du tableau. Non. On utilise tout simplement le signe d'assignation ordinaire, le signe "=" tout seul, comme pour n'importe quelle variable standard.

Maintenant, notre tableau associatif à deux dimensions $TradJoursMois prend la forme suivante :

array(3) {
  ["NomJour"]=>
  array(7) {
    ["Monday"]=>
    string(5) "Lundi"
    ["Tuesday"]=>
    string(5) "Mardi"
    ["Wednesday"]=>
    string(8) "Mercredi"
    ["Thursday"]=>
    string(5) "Jeudi"
    ["Friday"]=>
    string(8) "Vendredi"
    ["Saturday"]=>
    string(6) "Samedi"
    ["Sunday"]=>
    string(8) "Dimanche"
  }
  ["NomMois"]=>
  array(12) {
    ["January"]=>
    string(7) "janvier"
    ["February"]=>
    string(7) "février"
    ["March"]=>
    string(4) "mars"
    ["April"]=>
    string(5) "avril"
    ["May"]=>
    string(3) "mai"
    ["June"]=>
    string(4) "juin"
    ["July"]=>
    string(7) "juillet"
    ["August"]=>
    string(4) "août"
    ["September"]=>
    string(9) "septembre"
    ["October"]=>
    string(7) "octobre"
    ["November"]=>
    string(8) "novembre"
    ["December"]=>
    string(8) "décembre"
  }
  ["NomJourAllemand"]=>
  array(7) {
    ["Lundi"]=>
    string(6) "Montag"
    ["Mardi"]=>
    string(8) "Dienstag"
    ["Mercredi"]=>
    string(8) "Mittwoch"
    ["Jeudi"]=>
    string(10) "Donnerstag"
    ["Vendredi"]=>
    string(7) "Freitag"
    ["Samedi"]=>
    string(7) "Samstag"
    ["Dimanche"]=>
    string(7) "Sonntag"
  }
}

 



Comment accéder au contenu d'un tableau associatif à deux dimensions

Nous savons accéder au contenu des postes d'un tableau associatif à une dimension. Pour un tableau associatif à deux dimensions, c'est exactement la même chose, sauf qu'en plus de spécifier le libellé de l'étiquette du casier (la clé du poste), il faudra en plus dire dans quel poste primaire du tableau général il faut aller chercher.
Par exemple, nous écririons :

print ("En Anglais, Monday veut dire " .$TradJoursMois['NomJour']['Monday'] . " alors que Lundi se traduit en Allemand par " .$TradJoursMois['NomJourAllemand']['Lundi']) ;

Ce qui donne le résultat suivant :

"En Anglais, Monday veut dire Lundi alors que Lundi se traduit en Allemand par Montag"

Examinons l'instruction :

$TradJoursMois['NomJour']['Monday'] signifie pour PHP : Dans le tableau $TradJoursMois, va dans le poste qui porte l'étiquette 'NomJour' et dans ce poste (qui est lui même un tableau), va chercher la valeur contenue dans le casier (le poste) qui porte l'étiquette 'Monday'. Le résultat est "Lundi".
Ca peut aussi se lire à l'envers en disant : "je veux le contenu du poste qui porte l'étiquette 'Monday', lui même contenu dans le poste qui porte l'étiquette 'NomJour' dans le tableau $TradJoursMois". Notez que ce sont des crochets qui entourent les clés (étiquettes des postes) et que les clés (étiquettes des postes) elles mêmes sont placées entre guillemets. Normal, puisque ce sont des chaînes de caractères.

puis :

$TradJoursMois['NomJourAllemand']['Lundi'] signifie pour PHP : Dans le tableau $TradJoursMois, va dans le poste qui porte l'étiquette 'NomJourAllemand' et dans ce poste (qui est lui même un tableau), va chercher la valeur contenue dans le casier (le poste) qui porte l'étiquette 'Lundi'. Le résultat est "Montag".
Ca peut aussi se lire à l'envers en disant : "je veux le contenu du poste qui porte l'étiquette 'Lundi', lui même contenu dans le poste qui porte l'étiquette 'NomJourAllemand' dans le tableau $TradJoursMois". Notez toujours que ce sont des crochets qui entourent les clés (étiquettes des postes) et que les clés (étiquettes des postes) elles mêmes sont placées entre guillemets. Normal, puisque ce sont toujours des chaînes de caractères.

C'est pas plus compliqué que ça.

 



Comment modifier le contenu d'un poste d'un tableau associatif à deux dimensions

Là encore, il faut et il suffit de connaître le libellé de l'étiquette du poste à modifier et le libellé de l'étiquette du poste dans lequel se trouve ce poste. Supposons par exemple que nous voulions supprimer la majuscule pour le jour en Français et remplacer "Lundi" par "lundi", dans le poste qui porte l'étiquette "Monday", lui même contenu dans le poste 'NomJour' du tableau $TradJoursMois. Il suffit d'écrire :

$TradJoursMois['NomJour']['Monday'] = "lundi" ;

Et le tour est joué. La nouvelle valeur "lundi" a remplacé (on dit aussi "écrasé") l'ancienne valeur qui était "Lundi" dans le casier portant l'étiquette "Monday" du poste 'NomJour' du tableau $TradJoursMois.
On ne peut pas dire que ce soit très compliqué quand même !

 



Comment rajouter un poste à un tableau associatif à deux dimensions

Ca, en fait, nous l'avons déjà vu au chapitre Comment remplir un tableau associatif à deux dimensions en ajoutant le tableau"$JourSemaineAll" à notre tableau. Mais ça n'est pas mauvais de revenir dessus.

Pour rajouter un poste à un tableau associatif comme le nôtre, il suffit d'inventer un nouveau nom d'étiquette, de spécifier dans quel poste il faut rajouter ce nouveau casier, et de dire à PHP de se débrouiller. Par exemple, pour ajouter en allemand la traduction d'un jour "Férié" (frei), nous pourrions poursuivre notre oeuvre en écrivant :

$TradJoursMois['NomJourAllemand']['Férié'] = "Frei" ;

Le simple fait d'écrire ça, pour un tableau existant (déjà déclaré, bien entendu) signifie pour PHP : "Dans le tableau $TradJoursMois, puis dans le poste 'NomJourAllemand', tu crées un nouveau casier, tu lui colles une étiquette (clé) sur laquelle il sera marqué 'Férié' et dans ce casier, tu y range la valeur "Frei". Et il le fait sans rechigner (encore une chance...).

Peu importe l'ordre dans lequel nous créons de nouveaux postes, ni à quel niveau. PHP gère tout ça tout seul. Le tout pour nous, est de bien se souvenir des noms que nous donnons à nos étiquettes, pour pouvoir relire ce que nous avons mis comme valeur dans les casiers correspondants.

 

 



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.