如何访问Laravel集合对象中的第n个对象


How to access the nth object in a Laravel collection object?

我有一个laravel collection对象。

我想在其中使用第n个模型。

如何访问?

编辑:

我在laravel文档中找不到合适的方法。我可以在foreach循环中迭代集合,并在找到第n项时中断:

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

但是这看起来很乱。

更简洁的方法是执行上述循环一次,并创建一个包含集合中所有对象的简单数组。但这似乎是不必要的重复。

在laravel collection类文档中,有一个fetch方法,但我认为它从集合中获取与主键匹配的对象,而不是集合中的第n个。

看到Illuminate'Support'Collection实现了ArrayAccess,你应该能够简单地使用方括号符号,即

$collection[$nth]

在内部调用offsetGet,您也可以使用

$collection->offsetGet($nth)

最后,您可以使用get方法,它允许一个可选的默认值

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

@Phil的答案没有得到第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

我很晚才想到这个问题,但我认为这可能是一个有用的解决方案。

集合有slice方法和以下参数:

 $items->slice(whereToStartSlice, sizeOfSlice);

因此,如果您将whereToStartSlice参数设置为第n项,并将sizeOfSlice设置为1,则检索第n项。

的例子:

 $nthItem = $items->slice($nth,1);

如果您在排序后保持索引的集合有问题…您可以根据该集合的值创建一个新的集合,并尝试像您期望的那样访问新索引的集合:

。获取集合中价格第二高的物品

$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

与morphs答案相似,但不相同。在排序之后简单地使用values()不会得到预期的结果,因为索引仍然耦合到每个项。

感谢@howtomakeaturn在Laravel Github上提供这个解决方案:https://github.com/laravel/framework/issues/1335