Как получить доступ к n-му объекту в объекте коллекции Laravel?

У меня есть объект коллекции laravel.

Я хочу использовать в нем n-ю модель.

Как получить к нему доступ?

Редактировать:

Я не могу найти подходящий метод в документации laravel. Я мог бы перебирать коллекцию в цикле foreach и прерываться, когда найден n-й элемент:

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

Но это кажется грязным.

Более чистым способом было бы выполнить описанный выше цикл один раз и создать простой массив, содержащий все объекты в коллекции. Но это кажется ненужным дублированием.

В документации класса коллекции laravel есть метод fetch, но я думаю, что он извлекает объект из коллекции, соответствующий первичному ключу, а не n-му ключу в коллекции.


person theHands    schedule 26.06.2014    source источник
comment
Обмен своими исследованиями полезен всем. Расскажите нам, что вы пробовали и почему это не удовлетворило ваши потребности. Это показывает, что вы нашли время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов, и, прежде всего, это помогает вам получить более конкретный и актуальный ответ. Также см. Как спросить   -  person gnat    schedule 26.06.2014
comment
Справедливо. Вопрос отредактирован.   -  person theHands    schedule 26.06.2014


Ответы (3)


Поскольку Illuminate\Support\Collection реализует ArrayAccess, вы должны иметь возможность просто использовать нотацию с квадратными скобками, т.е.

$collection[$nth]

Это вызывает offsetGet внутри, которые вы также можете использовать

$collection->offsetGet($nth)

и, наконец, вы можете использовать метод get, который допускает необязательное значение по умолчанию.

$collection->get($nth)
// or
$collection->get($nth, 'some default value')
person Phil    schedule 27.06.2014

@ Ответ Фила не совсем дает n-й элемент, поскольку ключи могут быть неупорядочены. Если у вас есть красноречивая коллекция из запроса к базе данных, она будет работать нормально, но если ваши ключи не являются последовательными, вам нужно будет сделать что-то другое.

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

Вместо этого мы можем сделать $collection->values()[1] // string(4) bash, который использует array_values()

Или даже сделать макрос для этого:

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

Пример использования макроса:

$collection = collect([0 => 'bish', 2 => 'bash']);
$collection->nthElement(1) // string(4) 'bash'
$collection->nthElement(3) // undefined index
$collection->nthElement(3, 'bosh') // string (4) bosh
person Harry    schedule 05.05.2017

Если у вас возникли проблемы с коллекцией, сохраняющей индексы после сортировки... вы можете создать новую коллекцию из значений этой коллекции и попытаться получить доступ к новой индексированной коллекции, как и следовало ожидать:

например Получите второй самый дорогой предмет в коллекции

$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

Похоже на ответ морфов, но не то же самое. Простое использование values() после сортировки не даст ожидаемых результатов, поскольку индексы остаются связанными с каждым элементом.

Спасибо @howtomakeaturn за это решение на Github Laravel: https://github.com/laravel/framework/issues/1335

person Noah Gary    schedule 06.09.2019