logo du langage PHP Les bases du langage PHP

Chapitre 13 - Les arrays (tableaux)

documentation officielle

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');

Documentation officielle

J'ai la possibilité de le parcourir avec la fonction prédéfinie print_r()


print_r($liste_couleurs);
Array ( [0] => bleu [1] => rouge [2] => vert [3] => jaune )

Documentation officielle

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

Documentation officielle

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()

    Documentation officielle

    count() permet de compter tous les éléments d'un tableau, et c'est celle que j'utiliserai le plus souvent

  • sizeof()

    Documentation officielle

    sizeof() est, dixit la doc officielle, un équivalent de count()

  • implode

    Documentation officielle

    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