8- Les collections et la délégation

Les collections sont des assemblages de données itérables (que l’on peut parcourir). En PHP, ces collections sont représentées principalement par des Array (des paires clé-valeur). Un array est un tableau de données auquel chaque valeur est associé à une clé. Les valeurs stockées peuvent être de n’importe quel type : string, entier, flottant, tableau, booléen, objet… alors que les clés peuvent être soit des entiers soit des chaînes de caractères. Essayer d’assigner un booléen à une clé la transformera en 1 si true et 0 si false. De la même manière, une clé null sera transformée en une chaîne de caractères vide. Si aucune clé n’est définie pour les valeurs d’un array, PHP les ajoutera automatiquement sous forme d’entier en partant de zéro.

Note :

Il ne faut pas oublier que dans la plupart des langages, la première clé d'une collection est 0. Ainsi, pour ne pas oublier la première valeur lors d'une itération, on initialise l'itérateur à 0.

Déclaration d’un Array :

$tab = [];

Pour affecter des valeurs à un array, il n’est pas nécessaire de le déclarer avant, et on peut insérer des données à l’intérieur dès sa création. le signe d’affectation d’une valeur à un array est => mais on peut également insérer une valeur dans un array à sa déclaration, en utilisant la clé ou en utilisant une fonction

Déclaration + affectation d’un array :

$array = [
   "foo" => 5,
   0 => "toto",
   "toto" => false,
   "bar" => $a->getNumber()
];

On peut également insérer ou retirer des valeurs petit à petit d’un array. On peut également remplacer des valeurs en déclarant simplement que l’array pour la clé vaut une autre valeur.

Exemple :

$a = 'd';
$tab = ['a', 'b', 'c']; // par défaut php a attribué 1=>'a', 2=>'b', 3='c'
$tab[3] = $a; // $tab[3] retournera 'd'
$tab[3] = 'e'; // $tab[3] retournera 'e', il a remplacé 'd'

Autres manières d'ajouter une valeur dans un array :

$tab[] = 'e';//pousse une valeur à la fin de l'array qui prendra le dernier indice +1
array_push($tab, 'e');//pareil que le précédent
array_unshift($tab, 'e');//insère la valeur au début de l'array et reconstruit les clés en les décalant

Pour accéder aux valeurs d’un array, il faut passer par les clés de ce-dernier. Les clés se précisent entre crochets

echo $tab[3]; // écrit 'e'

Il est possible de faire énormément de choses avec les arrays (rechercher des valeurs, les transformer en chaînes de caractères, chercher dans les clés, diviser un array en plusieurs, fondre plusieurs arrays en un etc…), et la complexité augmente avec le nombre de dimensions (chaque array contenu dans un array ajoute une dimension) et il est parfois délicat d’itérer dans une itération pour afficher les valeurs d’une dimension.

Les arrays multidimensionnels

Comme nous l’avons dit précédemment, il est possible de déclarer des tableaux à plusieurs dimensions en insérant des arrays dans des arrays. Il est possible, comme précédemment, d’insérer les valeurs lors de la déclaration, ou plus tard.

Exemple d'insertion d'un tableau dans un autre tableau :

$tab = [1, 2, 3];
$tab[3] = ['a', 'b', 'c'];// ajoute un tableau à la fin de l'array
$tab[] = ['a', 'b', 'c']; // pareil
$tab[3] = array('a', 'b', 'c'); // pareil, ancienne méthode
array_push($tab, ['a', 'b', 'c']); // encore pareil
array_push($tab, array('a', 'b', 'c')); // toujours pareil

Pour accéder à une valeur contenu dans l’array qui correspond à la clé 3 de $tab, il faut utiliser deux crochets, l’un correspondant à la première dimension de $tab, le second correspondant à la deuxième dimension (de 3) et ainsi de suite.

Exemple :

echo $tab[3][1]; // retourne b

Pour accéder à toutes les valeurs d’un array, il est possible d’utiliser les itérations vues précédemment (for, while, foreach…), mais l’on préférera foreach qui prend en compte automatiquement la taille de l’array, et permet de traiter les clés indépendamment de leur type.

Exemple d’itération sur un array à 3 dimensions :

$annee2018 = [];
$semaine41 = ['lundi', 'mardi', 'mercredi'];
$rendezVousLundi = ['faire les courses', 'dîner avec collègues'];
$rendezVousMardi = ['aller au sport', 'réviser'];

$semaine41['lundi'] = $rendezVousLundi;
$semaine41['mardi'] = $rendezVousMardi;
$annee2018['41'] = $semaine41;

foreach($annee2018 as $numeroSemaine => $semaine){
   foreach ($semaine as $nomJour => $jour){
       foreach ($jour as $tache){
           echo 'pendant la semaine ' . $numeroSemaine . ', je dois ' . $tache . ' ' . $nomJour .'. ';
       }
   }
}

Il existe nativement beaucoup de fonctions sur PHP pour manipuler des arrays : des fonctions pour les trier, extraire les clés, extraire les valeurs, fusionner, éclater, transformer en chaînes… en énoncer le quart dans ce cours serait bien trop fastidieux, mais il est possible de les retrouver ici : http://php.net/manual/fr/ref.array.php