Les tableaux (array) dans PHP sont en réalité bien plus que de simples tableaux. D'après la doc : “Ce type est optimisé pour différentes utilisations ; il peut être considéré comme un tableau, une liste, une table de hachage, un dictionnaire, une collection, une pile, une file d'attente et probablement plus.”

Les tableaux dans PHP servent donc à tout et en conséquence on les utilise dans tous les scripts, soit de façon voulue par notre code, soit de façon imposée par PHP (cf les superglobales $_POST, $_GET, etc).

La création des tableaux est on ne peut plus simple, leur flexibilité est immense et PHP offre de nombreuses fonctions pour travailler avec des tableaux.

Un tableau est une struture de données contenant un certain nombre d'éléments. Chaque élément a une valeur et est situé à un indice. On peut voir un élément d'un tableau comme une valeur associée à un indice (ou à une clé). La taille d'un tableau est égal au nombre d'éléments qu'il contient.

Dans un tableau, il ne peut pas y avoir 2 éléments avec le même indice (ou la même clé) : on dit que l'indice ou la clé est "unique".

Les taille d'un tableau PHP n'est pas fixée à l'avance : on peut ajouter ou retirer des éléments à tout moment : les tableaux PHP sont dynamiques.

PHP supporte deux types de tableaux : à indices numériques et associatif :

- Dans un tableau à indices numériques, les clés sont des entiers (≥ 0).
- Dans un tableau associatif, les clés sont des chaînes de caractères.

Les valeurs des éléments d'un tableau peuvent être de n'importe quel type.

Des valeurs de types différents peuvent être stockés dans le même tableau.

En interne, PHP stocke tous les tableaux sous la forme de tableaux associatifs.
C'est au développeur de choisir les bonnes fonctions pour traiter soit un tableau à indices numériques, soit un tableau associatif.
Les fonctions traitant les tableaux à indices numériques reposent sur la régle suivante : tous les indices du tableau sont des entiers consécutifs commençant à 0.
Les éléments d'un tableau associatif sont triés suivant l'ordre d'insertion des éléments.
On peut créer des tableaux "mixtes" dont les clés peuvent être numériques et / ou alphabétiques. Dans ce cas, il faut utiliser pour le traitement les fonctions dédiées aux tableaux associatifs.

- La création d'un tableau est très facile : affecter une valeur avec la syntaxe $t[] = 'une valeur'; va créér le tableau $t si $t n'est pas déjà un tableau. Le tableau possède alors un seul élément situé à l'indice 0.
- Si $t est déjà un tableau, un nouvel élement va être ajouté à la fin du tableau. Quand l'indice n'est pas spécifié, PHP utilise un incrément (+1) de la plus grande clé entière.
- Pour accèder à la valeur d'un élément dans un tableau, on utilise des crochets : $t[10], $t['abcd'], $t[$i], etc.
- La fonction count() renvoie le nombre d'élément dans un tableau (associatif comme à indices numériques).

### Tableaux à indices numériques

On peut créer un tableau à indices numériques en affectant directement des valeurs à une variable en utilisant la notation à crochet.

Exemple : création d'un tableau à indices numériques
<?php require('bib_fonctions.php'); htmlDebut('Création d\'un tableau à indices numériques'); htmlInfo('En affectant directement des valeurs'); $t[] = 'François'; $t[] = 'Piat'; $t[] = 409; echo 'Nb éléments : ', count($t); echo '<pre>', print_r($t, true), '</pre>'; htmlFin(); ?>

Le code de l'exemple précédent va créer la variable $t de type tableau, car on utilise la notation à crochet au moment de la première affectation d'une valeur à cette variable (ligne 7). Comme on ne précise pas d'indice dans l'affectation, PHP va automatiquement affecter la première valeur à l'indice 0. A la ligne suivante, comme on ne précise pas non plus d'indice dans l'affectation, PHP va automatiquement affecter la valeur à l'indice le plus grand déjà utilisé (ici 0) + 1, soit ici l'indice 1. Etc, etc.

La numérotation des indices peut ne pas commencer à 0.

Exemple : création d'un tableau à indices numériques
<?php require('bib_fonctions.php'); htmlDebut('Création d\'un tableau à indices numériques'); htmlInfo('L\'indice de départ n\'est pas 0'); for ($i = 10; $i < 15; $i++) { $t[$i] = 'une valeur'; } echo 'Nb éléments : ', count($t); echo '<pre>', print_r($t, true), '</pre>'; htmlFin(); ?>

Les valeurs des indices peuvent ne pas être consécutives.

Exemple : création d'un tableau à indices numériques
<?php require('bib_fonctions.php'); htmlDebut('Création d\'un tableau à indices numériques'); htmlInfo('Valeurs d\indice non consécutives'); $t[0] = 'ce tableau'; $t[2] = 'a des'; $t[6] = 'trous'; $t[] = 'ce qui'; $t[3] = 'risque de'; $t[] = 'poser des '; $t[] = 'problèmes'; echo 'Nb éléments : ', count($t); echo '<pre>', print_r($t, true), '</pre>'; htmlFin(); ?>

### Attention aux trous dans les tableaux à indices numériques.

Si dans un tableau à indices numériques, les indices ne sont pas consécutifs, PHP ne comblera pas automatiquement les trous. Cela peut parfois poser des problèmes dans les itérations à travers ce type de tableau, comme le montre l'exemple suivant :

Exemple : tableau à trous
<?php error_reporting(E_ALL); require('bib_fonctions.php'); htmlDebut('Tableau à trous'); $t[0] = 'François'; $t[1] = 'Piat'; $t[5] = 409; $t[7] = '03 81 66 20 66'; echo 'Nombre d\'éléments : ', count($t); for ($i = 0, $iMax = count($t); $i < $iMax; $i++) { echo '<br>Indice = ', $i, ' | Elément = ', $t[$i]; } htmlFin(); ?>

On a ici 2 problèmes :

- la boucle fait 4 itérations à partir de 0 et donc les éléments aux indices 5 et 7 ne sont jamais atteints,
- les éléments inexistants aux indices 2 et 3 sont atteints.

La solution pour faire des itérations dans les éléments d'un tel tableau est d'utiliser une instruction foreachà la place de l'instruction for.

Exemple : tableau à trous
<?php require('bib_fonctions.php'); htmlDebut('Tableau à trous'); $t[0] = 'François'; $t[1] = 'Piat'; $t[5] = 409; $t[7] = '03 81 66 20 66'; htmlInfo('Boucle avec for'); for ($i = 0, $iMax = count($t); $i < $iMax; $i++) { echo '<br>Indice = ', $i, ' | Elément = ', $t[$i]; } htmlInfo('Boucle avec foreach - 1'); foreach ($t as $elt) { echo '<br>Elément = ', $elt; } htmlInfo('Boucle avec foreach - 2'); foreach ($t as $cle => $elt) { echo '<br>cle = ', $cle, ' | Elément = ', $elt; } htmlFin(); ?>

La fonction isset() permet de déterminer si une variable est définie ET est différente de NULL. Elle renvoie alors TRUE. Sinon, elle renvoie FALSE.
On peut l'utiliser pour savoir si une clé existe dans un tableau.

Exemple : savoir si une clé existe
<?php require('bib_fonctions.php'); htmlDebut('Savoir si une clé existe'); $t[0] = 'François'; $t[1] = 'Piat'; $t[5] = 409; $t[7] = '03 81 66 20 66'; htmlInfo('Indice 2 présent ?'); if (isset($t[2])) { echo 'Oui'; } else { echo 'Non'; } htmlInfo('Indice 5 présent ?'); echo isset($t[2]) ? 'Oui' : 'Non'; htmlFin(); ?>

### Tableaux associatifs

Dans un tableau associatif, les clés des éléments sont des chaines de caractères . Ce type de tableau est aussi appelé table de hachage, dictionnaire, table de symboles, map, ... Il est extrêment utilisé dans PHP.

Exemple : création d'un tableau associatif
<?php require('bib_fonctions.php'); htmlDebut('Création d\'un tableau associatif'); $t['B41d'] = 'Pierre'; $t['C24a'] = 'Paul'; $t['D12z'] = 'Jacques'; echo 'Nb éléments : ', count($t); echo '<pre>', print_r($t, true), '</pre>'; htmlFin(); ?>

Bien sûr avec un tel tableau, une boucle for est impossible. Il faut utiliser l'instruction foreach dans une ou l'autre de ses formes :

    foreach ($t as $val)
    ou
    foreach ($t as $cle => $val)

Dans la 1ere forme, $t représente le tableau sur lequel on veut itérer, et $val est une variable dans laquelle nous aurons la valeur de l'élément en cours dans la boucle.

Dans la 2eme forme, $t représente le tableau sur lequel on veut itérer, $cle est une variable dans laquelle nous aurons la valeur de la clé en cours, et $val est une variable dans laquelle nous aurons la valeur de l'élément en cours dans la boucle.

Exemple : boucle foreach
<?php require('bib_fonctions.php'); htmlDebut('Boucle foreach'); $t['B41d'] = 'Pierre'; $t['C24a'] = 'Paul'; $t['D12z'] = 'Jacques'; htmlInfo('1ere forme'); foreach ($t as $val) { echo '<br>Valeur = ', $val; } htmlInfo('2eme forme'); foreach ($t as $cle => $val) { echo '<br>cle = ', $cle, ' | valeur = ', $val; } htmlFin(); ?>