Как получить доступ к 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