web-dev-qa-db-fra.com

Comment accéder au nième élément d'un Laravel collection?

Je suppose que je ne respecte pas toutes les règles en posant délibérément une question en double ...

La autre question a une réponse acceptée. Cela résolut évidemment le problème des demandeurs, mais ne répondait pas à la question du titre.

Commençons par le début - la méthode first() est implémentée à peu près comme ceci:

foreach ($collection as $item)
    return $item;

C'est évidemment plus robuste que de prendre $collection[0] ou d'utiliser d'autres méthodes suggérées. 

Il se peut qu'aucun élément ne contienne index 0 ni index 15 même s'il y a 20 éléments dans la collection. Pour illustrer le problème, sortons cette collection de la documentation:

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'desk'],
    ['product_id' => 'prod-200', 'name' => 'chair'],
]);

$keyed = $collection->keyBy('product_id');

Avons-nous maintenant un moyen fiable (et de préférence concis) d’accéder au nième élément de $keyed?

Ma propre suggestion serait de faire:

$nth = $keyed->take($n)->last();

Mais cela donnera le mauvais élément ($keyed->last()) à chaque fois que $n > $keyed->count(). Comment pouvons-nous obtenir le nième élément s'il existe et null s'il ne se contente pas du comportement de first()?

Modifier

Pour clarifier, considérons cette collection:

$col = collect([
    2 => 'a',
    5 => 'b',
    6 => 'c',
    7 => 'd']);

Le premier élément est $col->first(). Comment obtenir le second?

$col->nth(3) devrait renvoyer 'c' (ou 'c' s'il est basé sur 0, mais cela serait incompatible avec first()). $col[3] ne fonctionnerait pas, il renverrait simplement une erreur.

$col->nth(7) devrait retourner null car il n'y a pas de septième élément, il n'y en a que quatre. $col[7] ne fonctionnerait pas, il retournerait simplement 'd'.

Vous pouvez reformuler la question comme suit: "Comment obtenir le nième élément de l'ordre Foreach?" si c'est plus clair pour certains.

9
Džuris

Je suppose que moyen plus rapide et plus efficace en termes de mémoire consiste à utiliser slice() method:

$collection->slice($n, 1);
12
Alexey Mezenin

Vous pouvez l’essayer avec values() function en tant que:

$collection->values()->get($n);
5
Amit Gupta

Peut-être pas la meilleure option, mais vous pouvez obtenir un élément d'un tableau dans une collection

$collection->all()[0] 
0
tylik