Définition des tableaux multidimensionnels en PHP
Un tableau multidimensionnel est un tableau qui va lui-même contenir d’autres tableaux en valeurs.
On appelle ainsi tableau à deux dimensions un tableau qui contient un ou plusieurs tableaux en valeurs, tableau à trois dimensions un tableau qui contient un ou plusieurs tableaux en valeurs qui contiennent eux-mêmes d’autres tableaux en valeurs et etc.
Les « sous » tableaux vont pouvoir être des tableaux numérotés ou des tableaux associatifs ou un mélange des deux.
Nous ne sommes pas limités dans le nombre de dimensions d’un tableau : le PHP sait tout à fait travailler avec des tableaux à 2, 3, 4, 5… dimensions. Cependant, il est généralement déconseillé de créer trop de dimensions de tableaux tout simplement car cela rend le code très vite très peu lisible et très peu compréhensible pour nous autres développeurs.
Vous pouvez déjà noter que le nombre de dimensions d’un tableau va indiquer le nombre d’indices nécessaires pour accéder à une valeur du tableau (nous allons illustrer cela par la suite).
Créer un tableau multidimensionnel en PHP
Un tableau multidimensionnel est un tableau dont les valeurs peuvent elles-mêmes être des tableaux qui vont à nouveau pouvoir contenir d’autres tableaux et etc.
Commençons déjà par créer des tableaux à deux dimensions. Vous pourrez ensuite créer des tableaux à 3, 4, 5… dimensions en suivant le même modèle.
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php /*Tableau multidimensionnel numéroté stockant *des tableaux numérotés*/ $suite = [ [1, 2, 4, 8, 16], [1, 3, 9, 27, 81] ]; /*Tableau multidimensionnel numéroté stockant *des tableaux associatifs et une valeur simple*/ $utilisateurs = [ ['nom' => 'Mathilde', 'mail' => 'math@gmail.com'], ['nom' => 'Pierre', 'mail' => 'pierre.giraud@edhec.com'], ['nom' => 'Amandine', 'mail' => 'amandine@lp.fr'], 'Florian' ]; /*Tableau multidimensionnel associatif stockant *des tableaux associatifs*/ $produits = [ 'Livre' => ['poids' => 200, 'quantite' => 10, 'prix' => 15], 'Stickers' => ['poids' => 10, 'quantite' => 100, 'prix' => 1.5] ] ?> <p>Un paragraphe</p> </body> </html>
Ici, on a créé trois tableaux $suite
, $utilisateurs
et $produits
à deux dimensions.
Notre premier tableau, $suite
, est un tableau multidimensionnel numéroté qui contient deux valeurs qui vont elles-mêmes être des tableaux numérotés : les valeurs [1, 2, 4, 8, 16]
et [1, 3, 9, 27, 81]
.
Notre deuxième tableau est à nouveau un tableau multidimensionnel numéroté qui contient cette fois-ci 4 valeurs : trois tableaux associatifs et la valeur « florian ». En effet, chaque valeur d’un tableau multidimensionnel ne doit pas forcément être elle-même un tableau : il suffit au contraire qu’une valeur d’un tableau soit elle-même un tableau pour que le tableau de départ soit multidimensionnel.
Finalement, notre dernier tableau est un tableau multidimensionnel associatif qui stocke deux valeurs qui sont elles-mêmes des tableaux associatifs. Ici, les clefs de notre tableau multidimensionnel sont Livre
et Stickers
et les valeurs associées sont les tableaux ['poids' => 200, 'quantite' => 10, 'prix' => 15]
et ['poids' => 10, 'quantite' => 100, 'prix' => 1.5]
.
Récupérer ou afficher une valeur en particulier d’un tableau multidimensionnel
Pour récupérer une valeur en particulier dans un tableau numéroté ou associatif à une dimension, il suffisait simplement d’indiquer la clef associée à la valeur en question.
Dans le cas d’un tableau multidimensionnel qui ne contient que des tableaux en valeur, nous allons donc accéder aux différents sous tableaux si on ne précise qu’une seule clef.
Regardez plutôt l’exemple suivant :
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php /*Tableau multidimensionnel numéroté stockant *des tableaux numérotés*/ $suite = [ [1, 2, 4, 8, 16], [1, 3, 9, 27, 81] ]; /*Tableau multidimensionnel numéroté stockant *des tableaux associatifs et une valeur simple*/ $utilisateurs = [ ['nom' => 'Mathilde', 'mail' => 'math@gmail.com'], ['nom' => 'Pierre', 'mail' => 'pierre.giraud@edhec.com'], ['nom' => 'Amandine', 'mail' => 'amandine@lp.fr'], 'Florian' ]; /*Tableau multidimensionnel associatif stockant *des tableaux associatifs*/ $produits = [ 'Livre' => ['poids' => 200, 'quantite' => 10, 'prix' => 15], 'Stickers' => ['poids' => 10, 'quantite' => 100, 'prix' => 1.5] ]; //$sous_suite = [1, 2, 4, 8, 16] $sous_suite = $suite[0]; echo $sous_suite[0]. '<br>'.$sous_suite[2]. '<br>'; //$sous_util = ['nom' => 'Amandine', 'mail' => 'amandine@lp.fr'] $sous_util = $utilisateurs[2]; echo $sous_util['nom']. '<br>'; //$sous_produits = ['poids' => 200, 'quantite' => 10, 'prix' => 15] $sous_produits = $produits['Livre']; echo $sous_produits['prix']; ?> <p>Un paragraphe</p> </body> </html>
Ici, on procède en deux étapes à chaque fois pour bien comprendre ce qu’il se passe. Notre but est d’afficher certaines valeurs finales de nos tableaux multidimensionnels à deux dimensions.
A chaque fois, on commence par récupérer l’une des valeurs de nos tableaux multidimensionnels qui sont elles-mêmes des tableaux.
On récupère la valeur liée à l’indice 0 de notre tableau $suite
c’est-à-dire le tableau [1, 2, 4, 8, 16]
qu’on place dans une variable $sous_suite
qui devient de fait une variable tableau. On affiche ensuite les valeurs liées aux clefs 0 et 2 de notre tableau sous-suite, c’est-à-dire 1 et 4.
On effectue le même type d’opérations avec nos deux autres tableaux multidimensionnels, en faisant bien attention à préciser les bonnes clefs textuelles lorsque nos tableaux et / ou sous tableaux sont des tableaux associatifs.
La chose à retenir ici est qu’il nous faut donc deux indices pour récupérer l’une des valeurs finales d’un tableau à deux dimensions qui ne contient que des tableaux en valeurs : un premier indice qui va nous permettre d’accéder à une valeur-tableau de notre tableau multidimensionnel et un deuxième indice qui va nous permettre d’accéder à une valeur effective dans notre valeur-tableau.
Nous allons alors pouvoir abréger l’écriture de la façon suivante :
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php /*Tableau multidimensionnel numéroté stockant *des tableaux numérotés*/ $suite = [ [1, 2, 4, 8, 16], [1, 3, 9, 27, 81] ]; /*Tableau multidimensionnel numéroté stockant *des tableaux associatifs et une valeur simple*/ $utilisateurs = [ ['nom' => 'Mathilde', 'mail' => 'math@gmail.com'], ['nom' => 'Pierre', 'mail' => 'pierre.giraud@edhec.com'], ['nom' => 'Amandine', 'mail' => 'amandine@lp.fr'], 'Florian' ]; /*Tableau multidimensionnel associatif stockant *des tableaux associatifs*/ $produits = [ 'Livre' => ['poids' => 200, 'quantite' => 10, 'prix' => 15], 'Stickers' => ['poids' => 10, 'quantite' => 100, 'prix' => 1.5] ]; echo $suite[0][0]. '<br>'.$suite[0][2]. '<br>'; echo $utilisateurs[2]['nom']. '<br>'; //Affichage d'une valeur simple contenue directement dans $utilisateurs echo $utilisateurs[3]. '<br>'; echo $produits['Livre']['prix']; ?> <p>Un paragraphe</p> </body> </html>
Pour accéder aux valeurs finales d’un tableau à 2 dimensions, nous allons devoir préciser deux indices : le premier indice permet d’accéder à une valeur (qui est un tableau) du tableau multidimensionnel et le deuxième indice sert à accéder à une valeur en particulier dans ce sous tableau.
Nous allons suivre exactement le même schéma pour les tableaux à 3, 4, 5… dimensions en précisant autant de clefs que notre tableau possède de dimensions.
Notez toutefois ici que dans le cas où notre tableau multidimensionnel contient à la fois des tableaux et des valeurs simples, alors on accèdera aux valeurs simples de manière « classique », c’est-à-dire en précisant seulement le nombre d’indices nous permettant d’accéder à la valeur en question. Il est cependant très rare d’avoir des tableaux multidimensionnels composés de valeurs-tableaux et de valeurs simples.
Parcourir et afficher les valeurs d’un tableau multidimensionnel
Pour parcourir toutes les valeurs d’un tableau multidimensionnel (et éventuellement les afficher ou effectuer d’autres opérations dessus), la meilleure manière de faire va être d’utiliser plusieurs boucles foreach
imbriquées.
On va ici utiliser autant de boucles foreach
qu’on a de dimensions dans le tableau qu’on souhaite parcourir. La première boucle foreach
va nous permettre de parcourir les valeurs de notre tableau multidimensionnel de base, puis la deuxième boucle foreach
va nous permettre de parcourir les valeurs des tableaux contenus directement dans le tableau multidimensionnel et etc.
Essayons d’afficher toutes les valeurs de nos tableaux précédents (note : j’ai enlevé la valeur simple « Florian » de mon tableau utilisateur car elle aurait été complexe à traiter ici).
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php $suite = [ [1, 2, 4, 8, 16], [1, 3, 9, 27, 81] ]; $utilisateurs = [ ['nom' => 'Mathilde', 'mail' => 'math@gmail.com'], ['nom' => 'Pierre', 'mail' => 'pierre.giraud@edhec.com'], ['nom' => 'Amandine', 'mail' => 'amandine@lp.fr'], ]; $produits = [ 'Livre' => ['poids' => 200, 'quantite' => 10, 'prix' => 15], 'Stickers' => ['poids' => 10, 'quantite' => 100, 'prix' => 1.5] ]; foreach ($suite as $suitenb => $n){ echo 'Suite ' .($suitenb + 1). ' : '; foreach($n as $ni => $nn){ echo $nn. ', '; } echo '<br><br>'; } foreach($utilisateurs as $nb => $infos){ echo 'Utilisateur n°' .($nb + 1). ' :<br>'; foreach ($infos as $c => $v){ echo $c. ' : ' .$v. '<br>'; } echo '<br>'; } foreach ($produits as $clef => $produit){ echo 'Produit : ' .$clef. '<br>'; foreach($produit as $caracteristique => $valeur){ echo $caracteristique. ' : ' .$valeur. '<br>'; } echo '<br>'; } ?> <p>Un paragraphe</p> </body> </html>
Ici, nos trois tableaux sont trois tableaux à deux dimensions. Nous allons donc utiliser deux boucles foreach
à chaque fois. La première boucle foreach
notre premier tableau $suite
va nous servir à accéder aux éléments de ce tableau multidimensionnel, c’est-à-dire aux deux clefs numérotées et aux deux valeurs qui sont des tableaux. On echo
déjà à partir de cette première boucle le numéro de la suite qui va être affichée en rajoutant 1 à la valeur de son index (puisque les index numérotés commencent à 0).
Lors du premier passage dans cette première boucle foreach
, on va donc accéder à notre première suite et on va echo
« Suite 1 : » et rentrer dans notre deuxième boucle foreach
. Cette deuxième boucle foreach
va parcourir le sous tableau [1, 2, 4, 8, 16]
et echo
les différentes valeurs du tableau à chaque fois.
Dès qu’on arrive à la fin de ce premier sous tableau, on retourne dans notre première boucle foreach
pour un deuxième passage et ce sont cette fois-ci les valeurs de notre deuxième sous tableau qui vont être affichées.
La chose à bien comprendre dans ce code est que notre boucle foreach
interne ou imbriquée va renvoyer toutes les valeurs d’un sous tableau puis on va ensuite retourner dans notre première boucle pour effectuer un autre passage.
Afficher rapidement la structure d’un tableau en PHP
Parfois, on voudra simplement afficher la structure d’un tableau PHP sans mise en forme pour vérifier ce qu’il contient ou pour des questions de débogage.
Le PHP nous fournit deux possibilités de faire cela : on va pouvoir soit utiliser la fonction print_r()
, soit la fonction var_dump()
que nous connaissons déjà pour afficher n’importe quel type de tableaux (numérotés, associatifs ou multidimensionnels).
Notez que var_dump()
va nous fournir davantage d’informations que print_r()
.
On va généralement utiliser cette fonction avec l’élément HTML pre
pour avoir un meilleur affichage de la structure du tableau qu’on souhaite afficher (je vous rappelle que pre
va permettre de conserver la mise en forme de notre code).
<!DOCTYPE html> <html> <head> <title>Cours PHP & MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Titre principal</h1> <?php $suite = [ [1, 2, 4, 8, 16], [1, 3, 9, 27, 81] ]; $utilisateurs = [ ['nom' => 'Mathilde', 'mail' => 'math@gmail.com'], ['nom' => 'Pierre', 'mail' => 'pierre.giraud@edhec.com'], ['nom' => 'Amandine', 'mail' => 'amandine@lp.fr'], ]; $produits = [ 'Livre' => ['poids' => 200, 'quantite' => 10, 'prix' => 15], 'Stickers' => ['poids' => 10, 'quantite' => 100, 'prix' => 1.5] ]; echo '<pre>'; print_r($produits); var_dump($produits); echo '</pre>'; ?> <p>Un paragraphe</p> </body> </html>