Les fonctions de manipulation de tableaux
Notions théoriques
Dans la séance précédente, vous avez appris à créer un tableau, à ajouter un élément, à compter les éléments et à parcourir un tableau avec foreach. Après avoir vu comment créer et parcourir un tableau, découvrons les fonctions qui permettent de le transformer efficacement, sans avoir à écrire une boucle à chaque fois.
PHP fournit de nombreuses fonctions natives pour manipuler les tableaux. Elles permettent de transformer, filtrer, agréger, rechercher, fusionner et trier des tableaux en une seule instruction.
Transformer chaque élément avec array_map()
La fonction array_map() applique une fonction à chaque élément d'un tableau et retourne un nouveau tableau contenant les résultats. Le tableau d'origine n'est pas modifié.
$nombres = [1, 2, 3, 4];
$carres = array_map(function ($n) {
return $n * $n;
}, $nombres);
print_r($carres); // [1, 4, 9, 16]
Depuis PHP 7.4, on peut écrire une fonction anonyme plus courte avec fn(), appelée fonction fléchée :
$carres = array_map(fn($n) => $n * $n, $nombres);
Une fonction fléchée retourne automatiquement le résultat de son expression, sans avoir besoin du mot-clé return.
Filtrer les éléments avec array_filter()
La fonction array_filter() conserve uniquement les éléments d'un tableau pour lesquels une condition retourne true.
$nombres = [1, 2, 3, 4, 5, 6];
$pairs = array_filter($nombres, function ($n) {
return $n % 2 === 0;
});
print_r($pairs); // [1 => 2, 3 => 4, 5 => 6]
array_filter() conserve les index d'origine : le tableau résultat n'est donc pas forcément réindexé à partir de 0. Pour obtenir un tableau propre réindexé, utiliser array_values() :
$pairs = array_values(array_filter($nombres, fn($n) => $n % 2 === 0));
print_r($pairs); // [0 => 2, 1 => 4, 2 => 6]
Agréger en une seule valeur avec array_reduce()
La fonction array_reduce() parcourt un tableau pour le réduire à une seule valeur, en accumulant un résultat au fur et à mesure.
$nombres = [1, 2, 3, 4];
$somme = array_reduce($nombres, function ($accumulateur, $n) {
return $accumulateur + $n;
}, 0);
echo $somme; // 10
Le troisième paramètre (0 ici) est la valeur initiale de l'accumulateur.
Tester la présence d'une valeur avec in_array()
La fonction in_array() permet de savoir si une valeur existe déjà dans un tableau. Elle retourne true ou false.
$fruits = ["pomme", "banane", "cerise"];
if (in_array("banane", $fruits)) {
echo "Il y a une banane dans le panier.";
} else {
echo "Pas de banane.";
}
Par défaut, in_array() compare les valeurs sans tenir compte du type ("5" == 5 est considéré vrai). Pour une comparaison stricte (valeur ET type), ajouter true en troisième paramètre : in_array("5", $tableau, true).
Fusionner des tableaux avec array_merge()
La fonction array_merge() combine plusieurs tableaux en un seul.
$fruits1 = ["pomme", "banane"];
$fruits2 = ["cerise", "kiwi"];
$tous = array_merge($fruits1, $fruits2);
print_r($tous); // ["pomme", "banane", "cerise", "kiwi"]
Avec des tableaux associatifs, si deux tableaux partagent la même clé, la valeur du dernier tableau écrase celle du premier :
$a = ["nom" => "Dupont"];
$b = ["nom" => "Martin", "age" => 30];
print_r(array_merge($a, $b)); // ["nom" => "Martin", "age" => 30]
Trier un tableau avec sort() et usort()
La fonction sort() trie un tableau indexé par ordre croissant, directement (elle modifie le tableau d'origine).
$notes = [12, 8, 15, 10];
sort($notes);
print_r($notes); // [8, 10, 12, 15]
Quand le tri par défaut ne suffit pas (par exemple pour trier un tableau de tableaux associatifs), on utilise usort() avec une fonction de comparaison personnalisée.
$eleves = [
["nom" => "Bob", "note" => 12],
["nom" => "Alice", "note" => 15],
["nom" => "Carol", "note" => 9],
];
usort($eleves, function ($a, $b) {
return $a["note"] <=> $b["note"];
});
print_r($eleves); // Carol (9), Bob (12), Alice (15)
L'opérateur <=> (appelé spaceship operator) compare deux valeurs et retourne -1, 0 ou 1. C'est le moyen le plus simple d'écrire une fonction de comparaison pour usort().
Exemple pratique
<?php
// Un panier de produits avec leur prix hors taxe
$produits = [
["nom" => "Clavier", "prixHT" => 40, "stock" => 12],
["nom" => "Souris", "prixHT" => 15, "stock" => 0],
["nom" => "Écran", "prixHT" => 120, "stock" => 5],
["nom" => "Casque", "prixHT" => 60, "stock" => 3],
];
// 1) array_map : calculer le prix TTC (TVA 20%) pour chaque produit
$produitsTTC = array_map(function ($produit) {
$produit["prixTTC"] = round($produit["prixHT"] * 1.2, 2);
return $produit;
}, $produits);
// 2) array_filter : garder uniquement les produits en stock
$enStock = array_filter($produitsTTC, function ($produit) {
return $produit["stock"] > 0;
});
// 3) array_reduce : calculer la valeur totale du stock TTC
$valeurTotale = array_reduce($enStock, function ($total, $produit) {
return $total + ($produit["prixTTC"] * $produit["stock"]);
}, 0);
echo "Valeur totale du stock : " . $valeurTotale . " euros\n";
// 4) in_array : vérifier la présence d'un nom de produit
$noms = array_map(fn($p) => $p["nom"], $produits);
if (in_array("Écran", $noms)) {
echo "L'écran fait partie du catalogue.\n";
}
// 5) usort : trier les produits en stock du moins cher au plus cher
usort($enStock, function ($a, $b) {
return $a["prixTTC"] <=> $b["prixTTC"];
});
foreach ($enStock as $produit) {
echo $produit["nom"] . " : " . $produit["prixTTC"] . " euros\n";
}
Ces fonctions se combinent très bien entre elles : on peut enchaîner array_filter() puis array_map() puis array_reduce() pour filtrer, transformer, puis agréger des données en quelques lignes seulement.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans ce TP, vous allez gérer un petit panier de produits en utilisant les fonctions de manipulation de tableaux vues dans cette séance.
- Dans votre répertoire "Documents" créez le répertoire
tp_fonctions_tableaux. - Dans ce répertoire créez le fichier
main.php:<?php// Les fonctions de manipulation de tableauxprint("Les fonctions de manipulation de tableaux \n\n");$produits = [["nom" => "Clavier", "prixHT" => 40, "stock" => 12],["nom" => "Souris", "prixHT" => 15, "stock" => 0],["nom" => "Écran", "prixHT" => 120, "stock" => 5],["nom" => "Casque", "prixHT" => 60, "stock" => 3],]; - Testez le fonctionnement de ce fichier :
php main.php
Étape 1 — Calculer le prix TTC de chaque produit
En utilisant array_map(), créez un tableau $produitsTTC qui contient les mêmes produits, avec en plus une clé "prixTTC" égale au prix HT multiplié par 1.2.
array_map() retourne toujours un nouveau tableau et ne modifie pas $produits. C'est une bonne pratique : cela évite les effets de bord et permet de garder les données d'origine intactes pour les réutiliser ailleurs.
Étape 2 — Ne garder que les produits en stock
En utilisant array_filter(), créez un tableau $enStock qui contient uniquement les produits dont le "stock" est supérieur à 0.
Filtrer les données inutiles (ici les produits sans stock) avant de faire des calculs plus lourds permet d'économiser du temps de traitement, surtout sur de grands tableaux.
Étape 3 — Calculer la valeur totale du stock
En utilisant array_reduce(), calculez la valeur totale du stock (somme de prixTTC * stock pour chaque produit en stock).
Le troisième paramètre de array_reduce() (la valeur initiale de l'accumulateur) évite les erreurs si le tableau est vide : sans lui, array_reduce() retournerait null sur un tableau vide au lieu de 0.
Étape 4 — Vérifier la présence d'un produit
En utilisant in_array(), vérifiez si le produit "Écran" fait partie de la liste des noms de produits.
Pour éviter les mauvaises surprises avec des types différents (par exemple "0" et 0), pensez à utiliser la comparaison stricte : in_array($valeur, $tableau, true).
Étape 5 — Fusionner un nouvel arrivage
Un nouvel arrivage de produits arrive : $nouveauxProduits = [["nom" => "Tapis de souris", "prixHT" => 8, "stock" => 20]];. Fusionnez-le avec $produits en utilisant array_merge().
Avec des tableaux indexés numériquement (comme ici), array_merge() renumérote les index à partir de 0 pour éviter tout conflit. C'est différent du comportement avec des tableaux associatifs, où les clés textuelles peuvent s'écraser.
Étape 6 — Trier le catalogue par prix
En utilisant usort(), triez $enStock du produit le moins cher au plus cher (sur prixTTC).
usort() trie le tableau en place mais conserve toutes les clés de chaque élément. C'est très pratique pour trier une liste d'enregistrements (produits, élèves, commandes…) sans perdre d'informations.