Nous avons principalement étudié dans les précédents cours les structures de données simples (constantes et variables). En plus de ces dernières, PHP propose des types de données structurés que l'on appelle plus communément des « tableaux ». A quoi servent-ils exactement ? Comment les manipule-t-on ? C'est ce dont nous allons étudier dans ce tutoriel.
Avant toute chose, il est bon de préciser qu'un tableau PHP et un tableau HTML sont deux choses complètement différentes. Un tableaux PHP a pour fonction de stocker et manipuler des informations tandis qu'un tableau HTML sert à présenter des données sur un écran.
Les tableaux, aussi appellés arrays en anglais, sont des types de données structurés permettant de grouper des informations ensemble. A la différence des types primitifs (entiers, réels, flottants, booléens, chaines de caractères), les tableaux peuvent stocker une ou plusieurs valeurs à la fois (de types différents).
Lors de la déclaration d'un tableau, il est inutile de préciser sa dimension et le type de données qu'il va contenir. PHP s'en charge automatiquement. Les tableaux sont dits dynamiques. A chaque nouvelle entrée enregistrée dans le tableau, PHP agrandit sa taille de 1 élément.
Le langage PHP propose également deux types distincts de tableaux : les tableaux à index numériques et les tableaux associatifs. Nous étudierons chacun de ces formats de tableaux plus loin dans ce cours.
La déclaration d'un tableau vide se fait de la même manière qu'une variable, c'est à dire avec un signe dollars ($) et un nom. Le format du nom doit respecter les mêmes règles de déclaration qu'une variable. Nous identifierons ensuite le tableau par le nom que nous lui avons attribué.
Pour déclarer un nouveau tableau, il suffit d'utiliser la structure de langage array(). Cette fonction prend en paramètres facultatifs (séparés par une virgule), les valeurs que l'on souhaite insérer dans le tableau pour l'initialiser. Si rien n'est précisé en paramètre, le tableau créé sera vide. Voici 3 exemples de déclaration et d'initialisation de tableaux.
Déclaration et initialisation de tableaux
<?php
// Déclaration d'un tableau vide
$fruits = array();
// Déclaration d'un tableau indexé numériquement
$legumes = array('carotte','poivron','aubergine','chou');
// Déclaration d'un tableau associatif
$identite = array(
'nom' => 'Hamon',
'prenom' => 'Hugo',
'age' => 19,
'estEtudiant' => true
);
?>
Explications :
Pour ajouter une nouvelle valeur dynamiquement à la fin des tableaux précédents, il suffit de procéder comme expliqué dans l'exemple suivant :
Ajout d'élément dans un tableau
<?php
// Ajout d'un légume au tableu indexé numériquement
$legumes[] = 'salade';
// Ajout de la taille de la personne dans le tableau associatif
$identite['taille'] = 180;
?>
Explications :
Dans le cas du tableau indexé numériquement, il est aussi possible d'ajouter une valeur à un index précis en procédant de cette manière :
Ajout d'éléments dans un tableau à clés numériques
<?php
// Ajout de légumes au tableu
$legumes[12] = 'endive';
$legumes[20] = 'piment';
?>
Explications :
Un tableau indexé numériquement est tout simplement une liste d'éléments reperés chacun par un index numérique unique. Le premier élément du tableau sera reperé par l'index 0, le second par l'index 1, le troisième par l'index 2 et ainsi de suite.
Pour accéder à un élement du tableau, il suffit d'y faire référence de cette manière : $tableau[0], $tableau[1], $tableau[2]... Reprenons notre exemple précédent :
Lecture d'une valeur dans un tableau à clés numériques
<?php
// Déclaration d'un tableau indexé numériquement
$legumes = array('carotte','poivron','aubergine','chou');
// Ajout d'un légume au tableu
$legumes[] = 'salade';
// Affichage de l'aubergine
echo $legumes[2];
?>
Il est apparu pour pallier les faiblesses du tableau à index numériques. En effet pour ce dernier, il faut absolument connaître son emplacement pour atteindre la valeur et pour un programmeur ce n'est pas toujours le cas. De plus, une valeur repérée par un index à moins de sens que cette même valeur repérée par une clé chainée.
Un tableau associatif est un tableau composé de couples clé chainée / valeur. A chaque clé est référencée une valeur. Nous avons vu précédemment comment déclarer un tableau associatif et lui associer des valeurs référencées par des clés.
Pour accéder à l'une des valeurs du tableau, il suffit d'y faire référence de la manière suivante : $tableau['cle']. Dans notre exemple précédent, nous pourrions afficher l'identité de la personne de cette façon :
Lectures de valeurs dans un tableau associatif
<?php
// Affichage des valeurs du tableau associatif
echo 'Nom : ', $identite['nom'] ,'<br/>';
echo 'Prénom : ', $identite['prenom'] ,'<br/>';
echo 'Age : ', $identite['age'] ,' ans<br/>';
echo 'Taille : ', $identite['taille'] ,' cm';
?>
Cela aura pour effet d'afficher à l'écran :
Résultat de l'exécution du script
Nom : Hamon
Prénom : Hugo
Age : 19 ans
Taille : 180 cm
Note : il est possible de mixer tableaux associatifs et tableaux indexés numériquement.
Nous venons de voir comment créer des tableaux simples à une seule dimension. On les appelle aussi « vecteurs ». Mais il est églament possible de créer des tableaux à plusieurs dimensions. Ce sont des tableaux de tableaux. Prenons un exemple simple. Nous allons concevoir une « matrice » (tableau à 2 dimensions) représentant une partie gagnante d'un jeu de morpion. Un jeu de morpion se représente visuellement par un tableau de 3 lignes sur 3 colonnes. Notre matrice aura donc ses caractéristiques.
Exemple de création d'une matrice (tableau 2D)
<?php
// Déclaration de la matrice
$matrice = array();
$matrice[0] = array('X','O','X');
$matrice[1] = array('X','X','O');
$matrice[2] = array('X','O','O');
?>
Explications :
Pour créer une matrice, nous devons mettre en place un tableau de tableaux. A chaque index numérique (ligne du tableau), nous associons un nouveau tableau de 3 cases (qui représente les 3 colonnes de la ligne). Si nous souhaitons accéder à la case du milieu du jeu de morpion, nous devons nous rendre à la ligne n°2 (index 1) et à la colonne n°2 (index 1). Ce qui donne :
Concrètement, pour accéder à une valeur d'une matrice, il faut y faire référence de cette manière :
Principe d'accès à une valeur d'une matrice
laMatrice[ numéroDeLigne ][ numéroDeColonne ]
Lorsque l'on déclare une variable stockant une chaine de caractères, nous faisons tout naturellement ceci :
Déclaration d'une chaine de caractères
<?php
$chaine = 'Bonjour le monde !';
?>
Par cette syntaxe, PHP va en réalité déclarer un tableau indexé numériquement qui contient N cases de 1 caractère. Ainsi nous pourrons accéder directement à une lettre de la chaîne de caractères de cette manière :
Lecture d'un caractère dans le tableau de chaine de caractères
<?php
$chaine = 'Bonjour le monde !';
echo $chaine[3]; // Affiche la lettre 'j'
?>
En retenant ce concept astucieux, nous pourrons par la suite traiter les chaînes de caractères de façon plus aisée.
Comme dans tout autre langage de programmation, le parcours de tableau se fait à l'aide de boucles. PHP dispose de sa propre structure de contrôle pour parcourir le contenu d'un tableau. Il s'agit de la structure foreach(). C'est une boucle particulière qui avance le pointeur du tableau à chaque itération. Celle-ci a été intégrée depuis la version 4 de PHP et se présente sous deux syntaxes possibles :
Parcours de tableaux avec foreach()
<?php
// Affichage des valeurs d'un tableau
foreach($leTableau as $valeur)
{
echo $valeur ,'<br/>';
}
// Affichage des couples clé / valeur
foreach($leTableau as $cle => $valeur)
{
echo $cle ,' : ', $valeur ,'<br/>';
}
?>
Cette structure prend en paramètre le nom du tableau à parcourir puis les données qu'il faut récupérer (valeurs uniquement ou bien valeurs et clés). Dans la première syntaxe, la valeur de l'élément courant du tableau est directement assignée à la variable $valeur. Dans la seconde, la clé courante de l'élément du tableau est affectée à la variable $cle et sa valeur stockée dans la variable $valeur.
Note : foreach() agit sur une copie du tableau d'origine.
Nous pourrions parcourir nos deux tableaux d'exemple ($legumes et $identite) en utilisant foreach(). Ainsi, nous obtiendrons le code suivant :
Parcours des tableaux $legumes et $identite
<?php
// Affichage des légumes
foreach($legumes as $valeur) {
echo $valeur ,'<br/>';
}
// Affichage de l'identité de la personne
foreach($identite as $cle => $valeur) {
echo $cle ,' : ', $valeur ,'<br/>';
}
?>
Remarquons également qu'il est tout à fait possible de parcourir un tableau au moyen d'une autre boucle. Prenons l'exemple de la boucle for() pour illustrer ce propos.
Parcours d'un tableau à indexes numériques contigus avec une boucle for()
<?php
// Calcul de la taille du tableau $legumes
$tailleLegumes = sizeof($legumes);
// Parcours du tableau
for($i=0; $i<$tailleLegumes; $i++)
{
echo $legumes[ $i ] ,'<br/>';
}
?>
Cette méthode a néanmois un inconvénient. Dans le cas des tableaux associatifs ou des tableaux à indexes numériques non contigus, il nous est difficile d'obtenir la clé de l'élément courant parcouru. La solution est d'avoir recours à des fonctions particulières de manipulation des tableaux pour obtenir les clés.
Lorsque l'on développe, il arrive très souvent que l'on veuille afficher le contenu d'un tableau dans le but de pouvoir débugguer un programme. Pour cela, PHP introduit la fonction print_r() qui assure cette fonction. Afin de respecter l'indentation à l'affichage, nous préfixons le résultat de cette fonction par les balises <pre> et </pre>. Le code qui suit affiche le contenu de notre tableau associatif $identite.
Le résultat produit sera le suivant :
Résultat de l'exécution du script
Array
(
[nom] => Hamon
[prenom] => Hugo
[age] => 19
[estEtudiant] => 1
[taille] => 180
)
1
Entre crochets figurent les clés et à droite des flèches les valeurs associées.
L'intérêt d'utiliser des tableaux pour structurer ses applications, c'est que cela permet ensuite d'opérer sur ces derniers. En effet, PHP propose une série de fonctions natives capables de manipuler ces structures. En voici quelques unes fréquemment employées et particulièrement utiles :
Pour connaître toutes les fonctions relatives aux tableaux, nous vous invitons à parcourir le chapitre dédié à ces derniers de la documentation officielle de PHP : les tableaux / arrays
Nous sommes arrivés au terme de ce chapitre sur les tableaux. Nous avons passés en revue tous les aspects théoriques et pratiques importants qu'il faut assimiler. Nous avons défini ce que sont les tableaux et étudié les deux types de tableaux de PHP. Puis nous avons appris à concevoir des tableaux multidimensionnels avant de finir sur le parcours et les opérations de manipulation.