Les tableaux (ou arrays)

Rechercher

Les tableaux (ou arrays)

  • Par Emacs
  • 14 commentaires
  • 247955 lectures
  • RSS -  Atom

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.

Qu'est-ce qu'un tableau ?

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.

Déclaration d'un tableau

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 :

  • La première instruction crée un tableau vide appellé $fruits.
  • La seconde déclare un tableau indexé numériquement de nom $legumes et rempli de 4 valeurs.
  • Enfin le dernier tableau créé est un tableau associatif de nom $identite et composé de couples clé => valeur.

Ajout d'une nouvelle entrée dans un tableau

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 :

  • La première instruction ajoute dynamiquement la valeur 'salade' à la fin du tableau. Le tableau contient donc à présent : carotte, poivron, aubergine, chou, salade.
  • La seconde instruction crée dynamiquement un nouveau couple clé ('taille') => valeur (180) à la fin du tableau.

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 :

  • PHP agrandit dynamiquement le tableau $legumes et ajoute la valeur 'endive' à l'index 12.
  • PHP agrandit encore dynamiquement le tableau $legumes et ajoute la valeur 'piment' à l'index 20.

Le tableau indexé numériquement

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];
?>

Le tableau associatif

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.

Les tableaux multidimensionnels

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 :

Accès à la valeur de coordonnées (1,1)
<?php
// Retourne X
echo $matrice[1][1];
?>

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 ]

Tableau particulier : la chaîne de caractères

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.

Parcours d'un tableau

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.

Afficher le contenu d'un tableau

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.

Affichage du contenu d'un tableau
<?php
echo '<pre>';
print_r($identite);
echo '</pre>';
?>

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.

Opérations sur les tableaux

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 :

  • count() et sizeof() retournent toutes les deux la taille du tableau passé en paramètre.
  • sort() trie les éléments d'un tableau du plus petit au plus grand.
  • rsort() trie les éléments d'un tableau du plus grand au plus petit.
  • in_array() permet de vérifier qu'une valeur est présente dans un tableau.
  • array_rand() extrait une ou plusieurs valeurs du tableau au hasard.
  • current() retourne la valeur de l'élément courant du tableau (où se trouve le pointeur)

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

Conclusion

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.



Les commentaires

1. Par Nod le 05/11/2007 21:40

Très beau tutoriaux.
Juste une petite faute à l'exemple "Exemple de création d'une matrice (tableau 2D)":
Il manque un ";" a la ligne 3.

2. Par Emacs le 05/11/2007 23:46

Merci pour le compliment. Effectivement le point virgule m'a échappé. Merci de nous l'avoir signalé

3. Par Leopard le 04/03/2008 09:11

Très bon tuto, j'avais jamais compris à quoi servait foreach() mais en fait, c'est très simple.

Juste une question :
J'ai un tableau indexé numériquement imbriqué dans un tableau associatif. Comment puis-je faire pour accéder à un index précis du tableau indexé numériquement en passant par le tableau associatif ?

PS : excuse-moi si ma question est débile hein

4. Par rabat le 28/04/2008 17:27

cmt vider un tableau ??

5. Par Emacs le 28/04/2008 18:31

@rabat :

// Pour vider un tableau :
$monTableau = array();

// Supprimer un tableau
unset($monTableau);

++

6. Par shark le 24/05/2008 21:51

Merci

7. Par toto le 12/01/2009 14:39

Avant on utilisait ça...mais avec le foreach c'est plus sympa effectivement

while(list($key,$value)=each($identite )) {
echo $key,' : ', $value,'<br/>';
}

8. Par Emacs le 12/01/2009 15:32

@toto : l'avantage du foreach() c'est qu'il permet notamment d'itérer sur les propriétés d'un objet

9. Par MassFerguson le 06/03/2009 13:56

Les tutos sont super claires, on comprend en un clin d'oeil les fonctionnalités du PHP et comment les mettre en oeuvre.
Félicitation pour la pédagogie, ce qui n'est pas le cas de tout les sites de formation.

Merci pour tout

10. Par Bob le 26/03/2009 21:43

Très bon Tuto.
Je veux créer et manipuler un tableau associatif dans un tableau associatif, mais j'ai quelques pb
1. création du tableau - je crois que c'est bon
§montab = array (
"annees" => array ("id_news"
);
2. Remplir le tableau, j'y suis arrivé, je ne mets pas le code, c'est pas là encore mon pb.
3. Je veux lire les 'news' de chaque 'année' - là encore cela a l'air d'être bon mais juste à l'air:
foreach (§montab['year'] as §tab1=>§value1) {
foreach (§montab[§value1] as §tab2=>§value2) {
}
}
Question: à quoi sert donc la déclaration associatif du sous tableau avec comme clé 'id_news'?

4. Attention ! C'est pour ce 4ème point que je pêche! Je souhaite récupérer trois news de trois années. L'idée c'est de créer des 'pages' où je ne verrai que trois années et pour chaques années que trois news. Je pédale, je n'arrive plus à m'y retrouver entre les clés, les valeurs de celui du tableau 'père' et celui du tableau 'fils'. J'imaginerai stocker le résultat des 'trois années' dans un tableau tempo que je pourrai traiter avec un foreach.

J'espère avoir été assez clair? C'est possible que non car moi même je suis vraiment un peu paumé (voir beaucoup ( )

11. Par bilgo le 07/05/2009 21:38

Bonjour,

Merci pour votre formidable travaille.

Juste une remarue : on dit "pallier quelque chose" et non "pallier à quelque chose"... "Pallier" avec 2 'l' et non 1 seul 'l'. SVP, vérifiez cela au début de la partie sur les tableaux associatifs.

Merci.

12. Par Emacs le 07/05/2009 23:26

Merci Bilgo, c'est corrigé !

13. Par TempsX le 29/08/2009 19:30

@ Emacs : merci pour ce boulot de vulgarisation. J'appréhende moins difficilement la création d'un site web avec Dupal et la compréhension de la structure des templates.
@ Bilgo : bonne remarque aussi mais "travail" s'écrit plus facilement que "travaille" !!!

14. Par dragonball le 30/09/2009 12:10

Salut
Merci beaucoup pour le tutoriel c'est très intéressant.
j'aimearais bien comprendre plus l'utilisation des tableaux. Merci bien !