Les Collections sont un type de classe qui permet de représenter une série de donnée et permettent d'apporter une solution plus objet au traitement des tableaux.
Pourquoi ne pas utiliser les tableaux ?
Avant de vouloir rajouter un nouveau concept dans notre application il est important de comprendre les problèmes que pose l'utilisation des tableaux.
La composition des fonctions
La lisibilité des fonctions n'est pas évidente lorsqu'elles sont enchaineées.
array_values(
array_map(function ($eleve) {
return $eleve['name'];
}, array_filter($eleves, function ($eleve) {
return $eleve['note'] >= 10;
}))
)
Certaines fonctions comme uasort()
ne peuvent pas être utilisées directement car attendent des paramètres passés par référence (ce qui force la création de variables intermédiaires).
Le manque de cohérence des fonctions
Ce n'est plus à démontrer mais l'ordre des paramètres n'est pas uniforme.
uasort ( array &$array , callable $value_compare_func ) : bool
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array
array_map ( callable $callback , array $array1 [, array $... ] ) : array
Mutation ou pas ?
Enfin, certaines fonctions altère le tableau original (array_splice
et array_shift
par exemple) alors que d'autre non, ce qui peut induire en erreur dans certaines situations.
Les Collections
Les collections permettent de corriger ces différents problématiques :
- La pluspart des méthodes retournent une nouvelle collection ce qui simplifie la composition et
- L'ordre des argument peut être unifié
collect($eleves)
->filter(function($eleve) {
return $eleve['note'] >= 10;
})
-> map(function($eleve) {
return $eleve['name']
})
->values()
->toArray();
Même si il est possible de développer son propre système de collection il peut être intéréssant de se reposer sur une librairie existante pour gagner du temps (surtout si on veut un code bien testé).
tightenco/collect
Laravel dispose d'un système de Collection plutôt complet mais n'offre pas de package séparé du framework. Mais une personne s'est motivé pour séparer les collections dans un package dédié.
Cette classe offre une centaine de méthodes et dispose d'un système original de Higher Order Messages.
collect($eleves)
-> map(function($eleve) {
return $eleve['name']
})
->values()
->toArray();
// Peut être racourci
collect($eleves)
->map->name
->values()
->toArray();