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

the*_*nds 20 php laravel laravel-collection

我有一个laravel集合对象.

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

我该如何访问它?

编辑:

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

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

但这看起来很混乱.

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

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

Phi*_*hil 42

看作Illuminate\Support\Collection工具ArrayAccess,你应该能够简单地使用方括号表示法,即

$collection[$nth]
Run Code Online (Sandbox Code Playgroud)

offsetGet内部调用您也可以使用

$collection->offsetGet($nth)
Run Code Online (Sandbox Code Playgroud)

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

$collection->get($nth)
// or
$collection->get($nth, 'some default value')
Run Code Online (Sandbox Code Playgroud)


Har*_*rry 9

@ Phil的答案并没有完全获得第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);
}):
Run Code Online (Sandbox Code Playgroud)

示例宏用法:

$collection = collect([0 => 'bish', 2 => 'bash']);
$collection->nthElement(1) // string(4) 'bash'
$collection->nthElement(3) // undefined index
$collection->nthElement(3, 'bosh') // string (4) bosh
Run Code Online (Sandbox Code Playgroud)


Lew*_*ren 7

我迟到了这个问题,但我认为这对某人来说可能是一个有用的解决方案。

集合具有带有以下参数的 slice 方法:

 $items->slice(whereToStartSlice, sizeOfSlice);
Run Code Online (Sandbox Code Playgroud)

因此,如果将第 n 个项目的 whereToStartSlice 参数设置为 1,则将检索第 n 个项目。

例子:

 $nthItem = $items->slice($nth,1);
Run Code Online (Sandbox Code Playgroud)