Fabrice Planchette

L'objet collection de Laravel

Jun 30, 2020

Manipuler un ensemble de données sous forme de tableau, pour un développeur backend, c’est un peu la base. PHP dispose ainsi d’une palanqué de fonctions (oui j’avais envie de placer ce mot…) et qui ont été implémentées, comment dire…, non j’te dis pas, je te montre plutôt.

81 fonctions

81 ! Il y a 81 fonctions possibles en PHP pour manipuler les tableaux (Cf php.net). Mais là où tu peux t’arracher les cheveux (si t’en as encore) c’est dans l’implémentation de ses fonctions. Là, pas de pilote dans l’avion, chacun a fait ce qu’il voulait !

Exemple :

array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
array_map ( callable $callback , array $array1 [, array $... ] ) : array
usort ( array &$array , callable $value_compare_func ) : bool
  • array_filter prend le tableau en 1er paramètre, puis un callable.
  • array_map prend le tableau en 1er paramètre, puis un callable. Ah bah non, c’est l’inverse…
  • Quant à usort, il ne prend même pas la peine de renvoyer le tableau trié puisqu’il est passé en référence.

Rien ne vaut un exemple concret avec un avant/après.

Prend ce tableau tout minion :

$data = [
    ['nom' => 'One', 'valeur' => 12000],
    ['nom' => 'Two', 'valeur' => 20000],
    ['nom' => 'Three', 'valeur' => 14000],
    ['nom' => 'Second', 'valeur' => 9000],
];

Et on te demande la chose suivante : Sortir les noms par ordre croissant de valeur, celle-ci devant être supérieur à 10000. Pourquoi on te demanderai ca ? C’est pour l’exemple je te dis. C’est pour avoir du tri, du filtre et du map.

Avec les fonctions natives de PHP

usort($data, function($a, $b) {
    return $b['valeur'] <=> $a['valeur'];
});

$data = array_filter($data, function($a) {
    return $a['valeur'] >= 10000;
});

$names = array_map(function($a) {
    return $a['nom'];
}, $data);

Et encore j’ai été sympa, j’ai pas imbriqué toutes ces fonctions parce qu’en terme de lisibilité, c’est juste affreux.

Avec les collections de Laravel

Heureusement, Laravel et son couteau suisse Collection sont là pour nous aider :)

$names = 
    collect($data)
    ->sortByDesc('valeur')
    ->filter(function($a) {
        return $a['valeur'] >= 10000;
    })
    ->map(function($a) {
        return $a['nom'];
    })
    ->toArray();

Hey! C’est pas beautiful ça !

Allez va chercher bonheur sur la documentation Laravel. Va!