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

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

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

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

изменить:

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

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

но это выглядит неаккуратно.

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

на фреймворк Laravel коллекции класса документация, есть метод fetch, но я думаю, что это извлекает объект из коллекции, соответствующий первичному ключу, а не nth в коллекции.

2 ответов


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

$collection[$nth]

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

$collection->offsetGet($nth)

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

$collection->get($nth)
// or
$collection->get($nth, 'some default value')

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

$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