How to access the nth object in a Laravel collection object?
Asked Answered
H

4

31

I have a laravel collection object.

I want to use the nth model within it.

How do I access it?

Edit:

I cannot find a suitable method in the laravel documentation. I could iterate the collection in a foreach loop and break when the nth item is found:

foreach($collection as $key => $object)
{
    if($key == $nth) {break;}
}
// $object is now the nth one

But this seems messy.

A cleaner way would be to perform the above loop once and create a simple array containing all the objects in the collection. But this seems like unnecessary duplication.

In the laravel collection class documentation, there is a fetch method but I think this fetches an object from the collection matching a primary key, rather than the nth one in the collection.

Hersey answered 26/6, 2014 at 9:54 Comment(2)
Sharing your research helps everyone. Tell us what you've tried and why it didn’t meet your needs. This demonstrates that you’ve taken the time to try to help yourself, it saves us from reiterating obvious answers, and most of all it helps you get a more specific and relevant answer. Also see How to AskMona
Fair enough. Question edited.Hersey
L
61

Seeing as Illuminate\Support\Collection implements ArrayAccess, you should be able to simply use square-bracket notation, ie

$collection[$nth]

This calls offsetGet internally which you can also use

$collection->offsetGet($nth)

and finally, you can use the get method which allows for an optional default value

$collection->get($nth)
// or
$collection->get($nth, 'some default value')
Legged answered 27/6, 2014 at 4:35 Comment(0)
C
15

@Phil's answer doesn't quite obtain the nth element, since the keys may be unordered. If you've got an eloquent collection from a db query it'll work fine, but if your keys aren't sequential then you'll need to do something different.

$collection = collect([0 => 'bish', 2 => 'bash']); $collection[1] // Undefined index

Instead we can do $collection->values()[1] // string(4) bash which uses array_values()

Or even make a macro to do this:

Collection::macro('nthElement', function($offset, $default = null) {
    return $this->values()->get($offset, $default);
}):

Example macro usage:

$collection = collect([0 => 'bish', 2 => 'bash']);
$collection->nthElement(1) // string(4) 'bash'
$collection->nthElement(3) // undefined index
$collection->nthElement(3, 'bosh') // string (4) bosh
Catholicize answered 5/5, 2017 at 9:39 Comment(1)
This one worled for me..Tungstite
A
7

I am late to this question, but I thought this might be a useful solution for someone.

Collections have the slice method with the following parameters:

 $items->slice(whereToStartSlice, sizeOfSlice);

Therefore, if you set the whereToStartSlice parameter at the nth item and the sizeOfSlice to 1 you retrieve the nth item.

Example:

 $nthItem = $items->slice($nth,1);
Ajax answered 28/9, 2021 at 15:3 Comment(2)
best answer for me as I'm working with a key-value pair collectionAdiel
Very handy if you want to grab first n items from the collection. You simply set offset to 0 and limit to the quantity you want. eg: $reviews->slice(0, 10) // first 10 reviewsBenedetto
E
2

If you are having problems with the collection keeping the indices after sorting... you can make a new collection out of the values of that collection and try accessing the newly indexed collection like you would expect:

e.g. Get the second highest priced item in a collection

$items = collect(
                 [
                  "1" => ["name" => "baseball", "price" => 5],
                  "2" => ["name"=> "bat", "price" => 15],
                  "3" => ["name" => "glove", "price" => 10]
                 ]
                );

collect($items->sortByDesc("price")->values())[1]["name"];

// Result: glove

Similar to morphs answer but not the same. Simply using values() after a sort will not give you the expected results because the indices remain coupled to each item.

Credit to @howtomakeaturn for this solution on the Laravel Github: https://github.com/laravel/framework/issues/1335

Ers answered 6/9, 2019 at 19:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.