Chapitre 13 - Les arrays (tableaux)
Un array peut se declarer de différentes façons. Voici la plus classique, dans un premier temps
$liste_couleurs = array('bleu', 'rouge', 'vert', 'jaune');
J'ai la possibilité de le parcourir avec la fonction prédéfinie print_r()
print_r($liste_couleurs);
Je peux aussi le parcourir avec var_dump(), autre fonction de gestion de variables
Elle me donnera, si besoin, plus d'informations (la longueur de chaque chaine de caractère, ainsi que son type)
Et du fait qu'elle soit riche en détails, il est préférable pour une meilleure lisibilité, de faire appel à la balise <pre>
Remarquez que <pre> a une syntaxe particulière
Ce n'est pas de la concaténation, mais une suite d'instructions que j'aurai pu développer sur trois lignes
echo "<pre>"; var_dump($liste_couleurs); echo "</pre>";
array(4) { [0]=> string(4) "bleu" [1]=> string(5) "rouge" [2]=> string(4) "vert" [3]=> string(5) "jaune" }
Un point important à noter
Si bleu est le premier élément de mon tableau, son indice est néanmoins 0 ([0] => bleu) ! Idem pour rouge, en seconde position, son indice est 1 ([1] => rouge)
C'est un comportement normal lorsque l'on parcourt un tableau. Les indices débuteront toujours par 0, puis indice 1 pour le second élément etc...
Ainsi, si je veux afficher le troisième (vert) je devrais crocheter à l'indice 2 de mon tableau
echo $liste_couleurs[2];
vert
L'occasion de découvrir une autre façon de declarer un array
$liste_pays [] = 'France';
$liste_pays [] = 'Espagne';
$liste_pays [] = 'Italie';
$liste_pays [] = 'Algérie';
$liste_pays [] = 'Argentine';
Crocheter un indice pour extraire un de ses éléments se fera de la même manière. Il en sera de même pour la syntaxe concernant print_r() ou var_dump()
Je vais profiter de ce chapitre pour mettre en avant une autre la boucle; la foreach. Elle est particulièrement adaptée pour parcourir et afficher (de manière conventionnelle) les données d'un tableau
Plus fréquemment que $indice et $valeur ci-dessous, vous rencontrerez $key et $value pour cette même syntaxe
Concrètement, je demande que pour chaque $indice (un alias de $liste_pays grace au as qui les sépare), je veux sa valeur (grace à =>)
foreach($liste_pays as $indice => $valeur){
echo "<p class='font-weight-bold'>" . $indice . " est l'indice pour le pays " . $valeur . "</p>";
}
0 est l'indice pour le pays France
1 est l'indice pour le pays Espagne
2 est l'indice pour le pays Italie
3 est l'indice pour le pays Algérie
4 est l'indice pour le pays Argentine
C'est la boucle que je privilégierai pour afficher, dans un tableau, mes données stockées en BDD. Avec la boucle while(); selon mes besoins, ce sont celles que j'utiliserai en permanence...
Je vais aborder deux fonctions sur les tableaux dans ce sous-chapitre (il en existe beaucoup d'autres), et une troisième, sur les chaines de caractères
-
count()
count() permet de compter tous les éléments d'un tableau, et c'est celle que j'utiliserai le plus souvent
-
sizeof()
sizeof() est, dixit la doc officielle, un équivalent de count()
-
implode
Si implode() n'est pas listée en tant que fonction sur les tableaux, elle permet néanmoins l'affichage de tous les éléments d'un tableau sous forme de chaine (notez le séparateur qu'elle prend en argument pour "aérer" les éléments entre eux)
echo "<p class='font-weight-bold'>" . count($liste_pays) . "</p>";
echo "<p class='font-weight-bold'>" . sizeof($liste_pays) . "</p>";
echo "<p class='font-weight-bold'>" . implode(' - ',$liste_pays) . "</p>";
5
5
France - Espagne - Italie - Algérie - Argentine
Première syntaxe pour déclarer un tableau multi-dimentionnel
$marvel_hero = array(
array('personnage' => 'Spiderman', 'prénom' => 'Peter', 'nom' => 'Parker'),
array('personnage' => 'Iron Man', 'prénom' => 'Tony', 'nom' => 'Stark'),
array('personnage' => 'Veuve Noire', 'prénom' => 'Natasha', 'nom' => 'Romanoff'),
);
echo "<p class='font-weight-bold'>" . $marvel_hero[2]['prénom'] . '</p>';
echo '<pre>'; var_dump($marvel_hero); echo '</pre>';
Natasha
array(3) { [0]=> array(3) { ["personnage"]=> string(9) "Spiderman" ["prénom"]=> string(5) "Peter" ["nom"]=> string(6) "Parker" } [1]=> array(3) { ["personnage"]=> string(8) "Iron Man" ["prénom"]=> string(4) "Tony" ["nom"]=> string(5) "Stark" } [2]=> array(3) { ["personnage"]=> string(11) "Veuve Noire" ["prénom"]=> string(7) "Natasha" ["nom"]=> string(8) "Romanoff" } }
Seconde façon, qui va générer un var_dump différent, ainsi qu'une autre syntaxe pour crocheter à l'indice désiré
$marvel_heros = array(
"Spiderman" => array("prénom" => "Peter", "nom" => "Parker"),
"Iron Man" => array("prénom" => "Tony", "nom" => "Stark"),
"Veuve Noire" => array("prénom" => "Natasha", "nom" => "Romanoff"),
);
echo "<p class='font-weight-bold'>" . $marvel_heros['Iron Man']['prénom'] . '</p>';
echo <pre>'; var_dump($marvel_heros); echo '</pre>';
Tony
array(3) { ["Spiderman"]=> array(2) { ["prénom"]=> string(5) "Peter" ["nom"]=> string(6) "Parker" } ["Iron Man"]=> array(2) { ["prénom"]=> string(4) "Tony" ["nom"]=> string(5) "Stark" } ["Veuve Noire"]=> array(2) { ["prénom"]=> string(7) "Natasha" ["nom"]=> string(8) "Romanoff" } }
Je peux exploiter la boucle foreach (pour parcourir et afficher les éléments de mon tableau) de deux façons :
Selon que je veuille les exploiter dans un cadre que j'ai prévu (ici dans une liste)
foreach($marvel_heros as $key => $value){
echo '<ul class="list-group">';
if(is_array($value)){
echo '<li class="list-group-item">';
echo "<h4 class='text-success'> $key </h4>";
foreach($value as $key => $value){
echo "<p class='font-weight-bold'>" . $key . ": " . $value . "</p>";
}
echo '</li>';
}
echo '</ul>';
}
Spiderman
prénom: Peter
nom: Parker
Iron Man
prénom: Tony
nom: Stark
Veuve Noire
prénom: Natasha
nom: Romanoff
Ou selon que je veuille les afficher dans un tableau
Je reprend mon premier array
$marvel_hero = array(
array('personnage' => 'Spiderman', 'prénom' => 'Peter', 'nom' => 'Parker'),
array('personnage' => 'Iron Man', 'prénom' => 'Tony', 'nom' => 'Stark'),
array('personnage' => 'Veuve Noire', 'prénom' => 'Natasha', 'nom' => 'Romanoff'),
);
La syntaxe ci-dessous est volontairement "nouvelle" pour un débutant et plus complexe qu'à l'accoutumée
Elle est plus complexe avec ses foreach(): endforeach; car c'est celle qui permet l'ouverture de plusieurs passages PHP, au sein du code HTML
Elle est bien entendu moins évidente a comprendre les premières fois, mais elle a ma préférence car plus rapide (si j'ai beaucoup d'affichage à générer dans un passage PHP). Au final, une fois les yeux et le cerveau habitués, elle sera plus simple a comprendre. A condition bien sur que le code soit bien indenté, mais comme il faut qu'il le soit en permanence...
Elle nécessite donc pour chaque foreach ou if, un endforeach ou endif (de même, pour chaque while ou for, un endwhile ou endfor)
Elle va aussi faire intervenir, lorsque nécessaire, la forme contractée (exemple en ligne 7<?= $key2 ?>)
Notez : du fait que ce soit un tableau à deux dimensions, ma boucle foreach interviendra au sein de chacune d'elles. Une première fois (ligne 2, j'entre dans le premier array, qui contient les autres) puis pour extraire les données (en ligne 6 pour les noms des colonnes, puis en ligne 16, pour les valeurs)
Avec une condition if pour la seconde dimension, pour différencier si c'est un nom de colonne ou une valeur
<table class="table col-md-6 text-center mx-auto">
<?php foreach($marvel_hero as $key => $value): ?>
<thead>
<?php if($key == 0): ?>
<tr>
<?php foreach($value as $key2 => $value2): ?>
<th><?= $key2 ?></th>
<?php endforeach; ?>
</tr>
<?php endif; ?>
</thead>
<tbody>
<?php if(is_array($value)): ?>
<tr>
<?php foreach($value as $key => $value): ?>
<td><?= $value ?></td>
<?php endforeach; ?>
</tr>
<?php endif; ?>
</tbody>
<?php endforeach; ?>
</table>
personnage | prénom | nom |
---|---|---|
Spiderman | Peter | Parker |
Iron Man | Tony | Stark |
Veuve Noire | Natasha | Romanoff |