4 fonctions pratiques sur les tableaux PHP

Retour

Introduction

Si tu es développeur PHP, tu es souvent amené à manipuler des tableaux. Et lorsque tu as besoin de faire une action sur un tableau, bien souvent tu vas itérer dessus avec une boucle foreach. Mais pourquoi boudes-tu les fonctions PHP ? Je vais t’en montrer quelques-unes qui te permettront d’éviter de faire une boucle et de montrer un peu ton intention 🚀

Array filter

Son nom est assez explicite : si tu as besoin de filtrer ton tableau, cette fonction est faite pour ça. En premier paramètre, tu lui passes ton tableau et le second, ça sera une fonction de callback. Depuis les fonctions flèchés, tu peux même te permettre de le faire en une seule ligne. Vises un peu :

$foods = ['🍔', '🍔', '🍔', '🍕', '🍕'];

// retourne un tableau avec 3 délicieux burgers
array_filter($foods, fn ($food) => $food === '🍔');
// retourne un tableau avec 2 magnifiques pizzas
array_filter($foods, fn ($food) => $food === '🍕');

💡 Tips : si tu veux retirer des éléments vides qui serait dans ton tableau, tu peux passer en second argument la fonction de PHP strlen : array_filter($array, ‘strlen’)

Array map

C’est la même chose qu’en JavaScript : si tu veux transformer les éléments de ton tableau en appliquant une fonction, c’est par ici que ça se passe. Mettons que tu n’aimes pas les burgers, tu veux 5 belles pizzas du chef Gino, alors avec une fonction flèché il te suffira de faire ceci :

array_map(fn () => '🍕', $foods);

Un autre cas plutôt cool avec array_map, c’est de pouvoir itérer sur deux tableaux (ou + ! ) en même temps :

$firstnames = ['Bruce', 'Alfred'];
$lastnames = ['Wayne', 'Pennyworth'];

$fullnames = array_map(function ($firstname, $lastname) {
     return $firstname . ' ' . $lastname;
}, $firstnames, $lastnames);

$fullnames sera donc un nouveau tableau avec deux valeurs : “Bruce Wayne” et “Alfred Pennyworth”.

Array reduce

Pour changer des burgers et des pizzas (mais pas trop 😁), on va partir sur un exemple un peu plus concret. Imaginons un panier d’achat dans lequel on pourrait mettre des produits. Pour se faire : une classe ShoppingCart et une classe Product. Dans ShoppingCart, j’ai ajouté une méthode computeTotal qui permet de faire la somme des prix de chaque produits. Plutôt que de faire une boucle, on utilise array_reduce :

class ShoppingCart
{
    public function __construct(
        public array $products,
        public float $total = 0
    ) {
        $this->total = $this->computeTotal();
    }

    private function computeTotal(): float
    {
        return array_reduce($this->products, fn ($acc, $product) => $acc += $product->price, 0);
    }
}

class Product
{
    public function __construct(
        public string $name,
        public float $price
    ) {}
}

$burger = new Product(name: 'burger', price: 10.00);
$pizza = new Product(name: 'pizza', price: 15.00);

$shoppingCart = new ShoppingCart([$burger, $pizza]);
$total = $shoppingCart->total;

Comment ça marche alors ? Le premier paramètre, c’est notre tableau de produits. Ensuite on a une fonction de callback qui prend deux paramètres : une variable qui va s’incrémenter et la valeur courante, ici produit. Le troisième paramètre, c’est pour initialiser la variable dont je t’ai parlé juste avant (celle qui s’incrémente). A chaque itération, on récupère le prix du produit et on l’ajoute à $acc. La valeur retournée sera l’addition de tous les prix. Super pratique ! Et si le tableau est vide, ça sera 0 qui sera retourné 👍

Array walk

Une petite dernière tout aussi pratique que les précédentes pour terminer. Array_walk fonctionne un peu comme array_map mais la différence c’est que array_walk a la possibilité de modifier directement les valeurs du tableau. Ce qui signifie que tu n’auras pas à réassigner ta variable. En effet, si le premier paramètre de la fonction est passé par référence, alors les valeurs du tableau d’origine vont changer.

Dans cette exemple, array_walk va parcourir le tableau et appliquer la fonction ucwords() sur chaque titres. Comme ma fonction anonyme reçoit le premier paramètre par référence, les titres contenus dans $movies seront bien modifiés.

$movies = ['the lord of the rings', 'the guardian of the galaxy'];
$titleCase = fn (&$title, $key) => $title = ucwords($title);
array_walk($movies, $titleCase);

Conclusion

Tu auras vu ou revu avec moi 4 fonctions sur les tableaux qui peuvent être pratique dans bien des cas. Il en existe une belle tripotée dans le documentation (PHP: Fonctions sur les tableaux). Si tu dois boucler sur un tableau, n’hésites pas à y faire un tour, peut-être que tu pourras éviter l’utilisation du foreach. Je ne dis pas que c’est mauvais, mais ça peut-être plus concis et selon la fonction appliquer, on pourra comprendre l’intention.