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()
?
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.
Je suppose que moyen plus rapide et plus efficace en termes de mémoire consiste à utiliser slice()
method:
$collection->slice($n, 1);
Vous pouvez l’essayer avec values()
function en tant que:
$collection->values()->get($n);
Peut-être pas la meilleure option, mais vous pouvez obtenir un élément d'un tableau dans une collection
$collection->all()[0]