Les tableaux

Résumé Support Quiz

Dans ce chapitre nous allons découvrir un nouveau type de données : Les tableaux.
Imaginons qu'on ait besoin de sauvegarder les notes d'un élève. La première approche consiste à créer plusieurs variables :

$note1 = 10; $note2 = 20; $note3 = 9;

Le problème, c'est que si on doit sauvegarder une dizaine, voire une centaine de notes, cette approche devient vite ingérable. Les tableaux permettent de solutionner ce problème en permettant de représenter une liste de valeurs.

Les tableaux indexés

Pour créer un tableau, on utilise les crochets et on sépare les valeurs par des virgules :

$notes = [10, 20, 9, 8];

On se retrouve avec un tableau qui contient quatre valeurs. Chaque valeur est accessible via son index (un numéro attribué automatiquement). Attention, les index commencent à 0.

Index Valeur
0 10
1 20
2 9
3 8

Accéder à une valeur

Pour récupérer une valeur particulière, on utilise les crochets avec le numéro de l'index :

$notes = [10, 20, 9, 8]; echo $notes[1]; // Affiche 20 (le deuxième élément, index 1) echo $notes[3]; // Affiche 8 (le quatrième élément, index 3)

Il faut bien penser à soustraire 1 : si on veut le quatrième élément, on utilise l'index 3.

L'ancienne notation

Dans les anciennes versions de PHP, les tableaux s'écrivaient différemment, avec la fonction array() :

// Ancienne notation $notes = array(10, 20, 9, 8); // Nouvelle notation (depuis PHP 5.4) $notes = [10, 20, 9, 8];

Les deux notations sont encore valables aujourd'hui, mais la syntaxe avec les crochets est devenue la norme et l'ancienne est de moins en moins utilisée.

Les tableaux associatifs

Les tableaux indexés conviennent bien pour des listes simples. Mais si on veut sauvegarder plusieurs informations sur un élève (son nom, son prénom et ses notes), un index numérique n'est pas très parlant.

PHP permet de définir des clés personnalisées pour chaque valeur. La notation utilise => pour associer une clé à sa valeur :

$eleve = [ 'nom' => 'Doe', 'prenom' => 'Jean', 'notes' => [10, 20, 15], ];

Pour accéder à une valeur, on utilise la même syntaxe qu'avec les index numériques, en remplaçant le nombre par la clé :

echo $eleve['nom']; // Affiche Doe echo $eleve['prenom']; // Affiche Jean

On peut même combiner les deux pour afficher le prénom et le nom :

echo $eleve['prenom'] . ' ' . $eleve['nom']; // Affiche Jean Doe

Ce format est beaucoup plus lisible qu'un tableau numérique. N'importe qui peut comprendre ce que représente chaque valeur sans avoir à compter les index.

Modifier et ajouter des valeurs

Pour modifier une valeur existante, on accède à la clé et on lui assigne une nouvelle valeur :

$eleve['prenom'] = 'Marc'; // Remplace Jean par Marc

Pour ajouter une nouvelle valeur à un tableau numérique, on peut spécifier l'index :

$eleve['notes'][3] = 16; // Ajoute une note à l'index 3

Mais il y a une manière plus pratique : utiliser des crochets vides. PHP attribue alors automatiquement le prochain index disponible :

$eleve['notes'][] = 16; // Ajoute 16 à la fin du tableau de notes

C'est beaucoup plus commode quand on a plusieurs valeurs à rajouter, car on n'a pas à se préoccuper de l'index.

Tableaux imbriqués

On peut avoir des tableaux qui contiennent d'autres tableaux. C'est particulièrement utile pour représenter des structures de données complexes. Par exemple, une classe qui contient plusieurs élèves :

$classe = [ [ 'nom' => 'Doe', 'prenom' => 'Jean', 'notes' => [16, 14, 18], ], [ 'nom' => 'Doe', 'prenom' => 'Jane', 'notes' => [12, 15, 17], ], ];

Pour récupérer la deuxième note du deuxième élève, on enchaîne les accès :

echo $classe[1]['notes'][1]; // Affiche 15

On décompose le raisonnement étape par étape :

  1. $classe[1] : le deuxième élève (index 1)
  2. ['notes'] : son tableau de notes
  3. [1] : la deuxième note (index 1)

C'est dans ces situations qu'il faut avoir une bonne représentation mentale de la structure du tableau pour savoir où se trouvent les valeurs que l'on cherche. Pas de panique si on s'y perd au début, c'est tout à fait normal et ça vient avec la pratique.

Déboguer un tableau

Si on essaie d'afficher un tableau avec echo, PHP affiche simplement Array car il ne sait pas comment convertir un tableau en chaîne de caractères. Pour inspecter le contenu d'un tableau, on utilise print_r() :

print_r($eleve['notes']);

Ce qui affiche quelque chose comme :

Array ( [0] => 10 [1] => 20 [2] => 15 [3] => 16 )

C'est très utile pour déboguer et comprendre la structure d'un tableau.

L'importance de l'indentation

Quand on travaille avec des tableaux imbriqués, l'indentation du code est capitale. Comparez ces deux versions :

// Difficile à lire $classe = [['nom'=>'Doe','prenom'=>'Jean','notes'=>[16,14,18]],['nom'=>'Doe','prenom'=>'Jane','notes'=>[12,15,17]]]; // Facile à lire $classe = [ [ 'nom' => 'Doe', 'prenom' => 'Jean', 'notes' => [16, 14, 18], ], [ 'nom' => 'Doe', 'prenom' => 'Jane', 'notes' => [12, 15, 17], ], ];

La règle est simple : dès qu'on ouvre un crochet et qu'on passe à la ligne, on indente d'un cran. La fermeture du crochet se fait au même niveau d'indentation que l'ouverture. Cette habitude permet de repérer immédiatement la structure des données et d'éviter bien des maux de tête lors de la relecture.