Je vais essayer d'être concis, les tableaux pourraient quasiment faire l'objet d'un petit bouquin. On s'en tiendra donc aux bases fondamentales.
N'oubliez pas que la documentation PHP consacre un chapitre à ce sujet et qu'il existe de nombreuses fonctions pour travailler directement avec des tableaux.
Un tableau, c'est en quelque sorte une variable structurée, un peu comme un meuble qui a des tiroirs, chaque tiroir pouvant contenir lui-même des "sous-tiroirs", etc...
Notez bien aussi que, par convention, on parlera souvent de tableaux indexés et de tableaux associatifs. En réalité, il s'agit toujours de tableaux indexés, mais lorsque les index ont un nom, on parle d'associatif. Si on ne précise pas le nom d'un index, PHP va le créer automatiquement en utilisant un entier.
Autre point important : si vous avez programmé dans certains autres langages, peut-être avez-vous appris à indiquer la taille d'un tableau lors de son initialisation. PHP offre une souplesse énorme en vous dispensant de cette dimension : les tableaux PHP sont dynamiques et ne sont pas limités en taille. Donc vous pourrez remplir votre tableau tant que vous en aurez besoin sans devoir vous soucier du nombre d'éléments. La seule limite réelle, ce seront les ressources système. Comme ces tableaux sont généralement stockés en mémoire, plus le tableau sera gros, plus vous aurez des problèmes et devrez envisager une solution alternative. Mais avant d'en arriver là, vous disposez quand même d'une certaine marge et, pour des besoins courants, vous n'aurez aucun problème de ce coté là.
Imaginons un moment le schéma suivant. Tu veux stocker de la nourriture. Tu peux subdiviser le "tableau alimentation" en plusieurs catéfories, limitons à 3 :
Comprenons bien : un tableau peut avoir une... ou plusieurs dimensions. Ainsi, je pourrais simplement faire un tableau qui contiendrait toutes les sortes possibles d'aliments. Mais tout ceci en vrac ne serait pas vraiment facile d'utilisation. On peut donc avoir les subdivisions exposées ici.
Chaque catégorie peut elle-même être subdivisée en sous-catégories:
alimentation
|- viandes:
| |- boeuf
| |- porc
| |- volailles
|- Poissons:
| |- poissons d'eau douce
| |- poissons de mer
|- Produits laitiers
| |- Lait
| |- beurre
| |- fromages
Et on pourrait en subdiviser certains encore mais arrêtons là, je pense que tu dois visualiser ce découpage sans trop de difficultés. Je vais traduire ça en php dans une variable $alimentation : la première chose à faire, c'est de déclarer notre variable comme un tableau.
<?php
$alimentation = array();
?>
Jusque là, rien de bien compliqué, on a un tableau tout ce qu'il y a de plus ordinaire. Maintenant, on veut mettre un contenu dedans, mais ce contenu est lui-même composé de tableaux. Il faut donc déclarer chacun des éléments comme des tableaux :
<?php
$alimentation['viandes'] = array();
$alimentation['poissons'] = array();
$alimentation['produits laitiers'] = array();
?>
Nos index "viandes", "poissons" et "produits laitiers" sont des chaines de caractères, mais de cette manière sont indiqués comme étant en quelque sorte les "tiroirs" où on va trouver le contenu.
Si on reprend ce second exemple, quand je subdivise ma variable $alimentation, j'aurais pu procéder autrement et commencer par assigner des valeurs en les déclarant en tableau : ça aurait donné le code suivant:
<?php
$alimentation = array(
"viandes" => array(),
"poissons" => array(),
"produits laitiers" => array()
);
?>
Le résultat serait exactement le même, mais la première méthode simplifie un peu... encore que ça reste une question de point de vue et d'habitude personnelle.
Premier point : $alimentation est un tableau associatif, il associe un index nommé à un contenu, que ce contenu soit une valeur ou un tableau de valeurs.
On va maintenant remplir nos "sous-tableaux" : là aussi, nous aurons des tableaux associatifs :
<?php
$alimentation['viandes']['boeuf'] = array();
$alimentation['viandes']['porc'] = array();
$alimentation['viandes']['volailles'] = array();
$alimentation['poissons']['poissons eau douce'] = array();
$alimentation['poissons']['poissons de mer'] = array();
?>
J'ai arrêté là parce que le suivant est particulier : Si dans $alimentation['viandes']['boeuf'] je peux logiquement stocker "steak", "roti", "filet mignon", avec le lait, je ne peux plus subdiviser, donc, $alimentation['produits laitiers']['lait'] n'aurait pas de sens* : là, je dois enregistrer une valeur "lait" et non un sous-tableau : on parle alors de "valeur scalaire". Même chose pour "beurre" alors que "fromage" peut être un tableau : $alimentation['produits laitiers'] sera donc un tableau mixte avec deux sortes d'index. Ajoutons les valeurs, les explications suivent :
<?php
$alimentation['produits laitiers'][] = "lait";
$alimentation['produits laitiers'][] = "beurre";
$alimentation['produits laitiers']['fromages'] = array();
?>
Là, j'ai à la fois des valeurs et un sous-tableau : ajoutons à ce dernier quelques valeurs :
<?php
$alimentation['produits laitiers']['fromages'][] = "Camembert";
$alimentation['produits laitiers']['fromages'][] = "Tomme de Savoie";
$alimentation['produits laitiers']['fromages'][] = "Roquefort";
?>
Là, tu as vu comment ajouter des valeurs dans un tableau indexé : le nom du tableau avec son index associatif auquel on ajoute des crochets vides et on assigne une valeur. Comme je l'ai mentionné en introduction, si on ne nomme pas soi-même un index, PHP le fera automatiquement en utilisant un entier et l'incrémentation sera automatique à partir de 0. La numérotation partira cependant à partir du plus grand index numérique existant. Ainsi, si je décide de nommer un index moi-même en mettant par exemple [256], PHP détectera la présence d'un index numérique entier et incrémentera ce dernier (s'il n'y en a pas de plus grand) et le prochain qui ne sera pas explicitement nommé sera alors [257].
Maintenant, reproduis ces lignes et ajoute ensuite le code suivant :
<pre>
<?php
var_dump($alimentation);
?>
</pre>
affiche ta page et observe le résultat, tu devrais avoir quelque chose d'assez visuel pas trop complexe à comprendre. Nous obtenons ceci:
array(3) {
["viandes"]=>
array(3) {
["boeuf"]=>
array(0) {
}
["porc"]=>
array(0) {
}
["volailles"]=>
array(0) {
}
}
["poissons"]=>
array(2) {
["poissons eau douce"]=>
array(0) {
}
["poissons de mer"]=>
array(0) {
}
}
["produits laitiers"]=>
array(3) {
[0]=>
string(4) "lait"
[1]=>
string(6) "beurre"
["fromages"]=>
array(3) {
[0]=>
string(9) "Camembert"
[1]=>
string(15) "Tomme de Savoie"
[2]=>
string(9) "Roquefort"
}
}
}
Comment "lire" ceci ? Observe bien : nous avons là ce que contient $alimentation : ça nous indique que c'est un tableau contenant trois éléments "array(3)", on lit ensuite le premier index ["viande"] qui est...un tableau aussi contenant lui aussi 3 éléments. Continuons, le premier élément contenu sous l'index "viandes" est "boeuf" : c'est un tableau aussi contenant... rien tu tout, mais on sait que c'est un tableau : "array(0)". PHP crée une indentation pour permettre de repérer le niveau de profondeur quand on a plusieurs dimensions dans un tableau. On trouve ainsi "poissons" et "produit laitiers" au même niveau que "viandes" et ainsi de suite pour les autres index.
Si je continue un peu plus loin, en arrivant dans les produits laitiers, je trouve l'index "fromage", un tableau de trois éléments : là, regarde bien, les index suivant sont numériques, 0, 1 et 2 et chacun contient une chaine de caractère, par exemple, [0] est une chaine de 9 caractères "string(9)" (Camembert). Avec un peu d'habitude, on finit par se rendre compte qu'un tableau contient beaucoup d'informations utilisables en plus des valeurs stockées elle-mêmes.
Voilà, et on oublie pas la Doc.
[*]Note : j'entend d'ici quelques esprits caustiques me murmurer : ben si, on peut parler de lait entier, semi-écrèmé, lait de chèvre, etc... compliquons pas la manoeuvre, ce n'est pas le but de cet article