Aller au contenu
M07 · B. Programmer en PHP

Traiter les données : tableaux simples, associatifs et multidimensionnels

Créer et parcourir des tableaux indexés et associatifs, des tableaux de tableaux (comme les lignes d'une table), les fonctions utiles (count, in_array, sort, array_filter, array_map, array_sum) et l'affichage en HTML.

1Situer

Une page de Souk Atlas ne manipule presque jamais une seule valeur : une liste de produits, un panier, les lignes d'une commande. En PHP, tout cela se range dans des tableaux. Ce sont aussi des tableaux que PDO renverra quand on lira la base de données (leçon C.1).

2Comprendre

Trois formes de tableaux
$villes 0'Fès' 1'Safi' 2'Agadir' 3'Tanger' echo $villes[1] → Safi $produit 'nom' => 'Savon noir' 'prix' => 30 'stock' => 120 echo $produit['prix'] → 30 $panier indice'nom''prix''qte' 0Savon noir303 1Huile d'argan1201 2Babouches cuir1502 $panier[1]['nom'] → Huile d'argan foreach ($panier as $ligne) : une ligne par tour

Un tableau indexé : des casiers numérotés à partir de 0. $villes[1] vaut « Safi ».

1 / 5

Les tableaux indexés

$villes = ["Fès", "Safi", "Agadir"];
echo $villes[0];           // Fès
$villes[] = "Tanger";      // ajout à la fin (indice 3)
$villes[1] = "Essaouira";  // remplacement
echo count($villes);       // 4
unset($villes[2]);         // suppression (les indices ne sont pas renumérotés)

Les tableaux associatifs

$produit = [
    'nom'   => 'Savon noir',
    'prix'  => 30,
    'stock' => 120,
];
echo $produit['nom'];                     // Savon noir
$produit['prix'] = 35;                    // modification
$produit['categorie'] = 'Cosmétique';     // nouvelle clé

foreach ($produit as $cle => $valeur) {
    echo "$cle : $valeur<br>";
}

Fonctions utiles : array_key_exists('prix', $produit) (ou isset($produit['prix'])), array_keys(), array_values(), in_array($valeur, $tableau).

Les tableaux multidimensionnels

$produits = [
    ['id' => 1, 'nom' => 'Tajine décoré', 'prix' => 180],
    ['id' => 4, 'nom' => "Huile d'argan", 'prix' => 120],
    ['id' => 5, 'nom' => 'Savon noir',    'prix' => 30],
];
echo $produits[1]['nom'];   // Huile d'argan

Trier, filtrer, transformer

$prixListe = array_column($produits, 'prix');              // [180, 120, 30]
$total = array_sum($prixListe);                            // 330
$chers = array_filter($produits, fn($p) => $p['prix'] > 100);
$noms = array_map(fn($p) => strtoupper($p['nom']), $produits);
usort($produits, fn($a, $b) => $a['prix'] <=> $b['prix']); // du moins cher au plus cher

L’opérateur <=> (« vaisseau spatial ») renvoie -1, 0 ou 1 : c’est exactement ce qu’attend usort.

Déboguer un tableau

echo $tableau; affiche seulement « Array » (avec un avertissement « Array to string conversion »). Pour voir le contenu :

  • print_r($t) : lisible, à entourer de <pre>...</pre> dans une page ;
  • var_dump($t) : avec les types et les longueurs ;
  • json_encode($t) : une ligne au format JSON, très pratique pour les API (leçon D.2).
Exemple simple

Le casier numéroté

Un tableau indexé, c'est une rangée de casiers numérotés à partir de 0 : $villes[0] = 'Fès', $villes[1] = 'Safi'.

Exemple simple

La fiche d'un produit

Un tableau associatif, c'est une fiche avec des rubriques nommées : ['nom' => 'Savon noir', 'prix' => 30]. On ne cherche plus la case n° 1, mais la case 'prix'.

3Manipuler

Le panier est un tableau de lignes. Complétez le script pour calculer et afficher ce qui est demandé.
Pas à pas dans le lab ↗ Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).

La page s'affichera ici.

Le navigateur demandera /panier.php au serveur, qui exécutera le PHP et renverra du HTML.

Entre le navigateur et le serveur aucun échange pour l'instant

Consignes 0 / 3

  1. Le tableau affiche le sous-total des babouches : 300
  2. « Total : 590 DH »
  3. « Articles à plus de 100 DH : Huile d'argan, Babouches cuir »

4Pratiquer

Exercice 1 · Statistiques de ventes

À partir de $ventes = [1200, 0, 450, 980, 0, 1530, 700] (une valeur par jour), affichez le total, la moyenne, la meilleure journée et le nombre de jours sans vente.

Voir le corrigé
<?php
$ventes = [1200, 0, 450, 980, 0, 1530, 700];
$total = array_sum($ventes);
$moyenne = round($total / count($ventes), 2);
$max = max($ventes);
$sansVente = count(array_filter($ventes, fn($v) => $v === 0));
echo "Total $total DH, moyenne $moyenne DH, meilleur jour $max DH, $sansVente jours sans vente";

Exercice 2 · Trier le catalogue

$prix = ['Tajine' => 180, 'Savon' => 30, 'Tapis' => 1200]. Affichez les produits du moins cher au plus cher, puis par ordre alphabétique.

Voir le corrigé
<?php
$prix = ['Tajine' => 180, 'Savon' => 30, 'Tapis' => 1200];
asort($prix);            // trie par valeur en gardant les clés
print_r($prix);          // Savon 30, Tajine 180, Tapis 1200
ksort($prix);            // trie par clé
print_r($prix);          // Savon, Tajine, Tapis

Exercice 3 · Regrouper par ville

À partir d'une liste de clients ['nom' => ..., 'ville' => ...], construisez un tableau $parVille où chaque ville contient la liste de ses clients.

Voir le corrigé
<?php
$clients = [
    ['nom' => 'Amina', 'ville' => 'Fès'],
    ['nom' => 'Youssef', 'ville' => 'Casablanca'],
    ['nom' => 'Karim', 'ville' => 'Fès'],
];
$parVille = [];
foreach ($clients as $c) {
    $parVille[$c['ville']][] = $c['nom'];
}
print_r($parVille);   // ['Fès' => ['Amina', 'Karim'], 'Casablanca' => ['Youssef']]

5Vérifier

1. Que vaut count(['Fès', 'Safi', 'Agadir']) ?
2. Comment ajouter « Tanger » à la fin de $villes ?
3. Quelle fonction affiche lisiblement tout le contenu d'un tableau pour déboguer ?