У меня есть объект коллекции laravel.
Я хочу использовать в ней n-ю модель.
Как мне получить к нему доступ?
Редактировать:
Я не могу найти подходящий метод в документации laravel . Я мог бы перебирать коллекцию в цикле foreach и ломаться при обнаружении n-го элемента:
foreach($collection as $key => $object) { if($key == $nth) {break;} } // $object is now the nth one
Но это кажется беспорядочным.
Более чистым способом было бы выполнить вышеописанный цикл один раз и создать простой массив, содержащий все объекты в коллекции. Но это кажется ненужным дублированием.
В документации класса коллекции laravel существует метод выборки, но я думаю, что это позволяет получить объект из коллекции, соответствующий первичному ключу, а не n-й в коллекции.
Увидев, что Illuminate\Support\Collection
реализует ArrayAccess
, вы должны просто использовать квадратную скобку, т. 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