我想我是故意制造一个重复的问题而违反所有规则......
other question已接受答案。它显然解决了问题,但它没有回答标题问题。
让我们从头开始 - first()
方法实现如下:
foreach ($collection as $item)
return $item;
它显然比采用$collection[0]
或使用其他建议方法更强大。
即使集合中有20个项目,也可能没有索引0
或索引15
的项目。为了说明问题,让我们从文档中获取此集合:
$collection = collect([
['product_id' => 'prod-100', 'name' => 'desk'],
['product_id' => 'prod-200', 'name' => 'chair'],
]);
$keyed = $collection->keyBy('product_id');
现在,我们是否有任何可靠(最好简洁)的方式来访问$keyed
的第n项?
我自己的建议是:
$nth = $keyed->take($n)->last();
但是,只要$keyed->last()
,这将给出错误的项目$n > $keyed->count()
)。我们怎样才能获得第n个项目(如果它存在)和null
如果它不像first()
那样?
为了澄清,让我们考虑一下这个集合:
$col = collect([
2 => 'a',
5 => 'b',
6 => 'c',
7 => 'd']);
第一项是$col->first()
。如何获得第二个?
$col->nth(3)
应该返回'c'
(或'c'
如果从0开始,但这与first()
不一致。 $col[3]
无法正常工作,只会返回错误。
$col->nth(7)
应该返回null
,因为没有第七项,只有四项。 $col[7]
无法正常工作,只会返回'd'
。
您可以将问题改为"如何在foreach顺序中获取第n个项目?"如果对某些人来说更清楚。
答案 0 :(得分:12)
我想更快,更节省内存的方法是使用slice()
方法:
$collection->slice($n, 1);
答案 1 :(得分:7)
您可以使用values()
功能尝试:
$collection->values()->get($n);
答案 2 :(得分:1)
根据Alexey的回答,您可以在AppServiceProvider中创建一个宏(将其添加到register方法中):
use Illuminate\Support\Collection;
Collection::macro('getNth', function ($n) {
return $this->slice($n, 1)->first();
});
然后,您可以在整个应用程序中使用它:
$collection = ['apple', 'orange'];
$collection->getNth(0) // returns 'apple'
$collection->getNth(1) // returns 'orange'
$collection->getNth(2) // returns null
$collection->getNth(3) // returns null
答案 3 :(得分:0)
您可以使用 offsetGet
,因为 Collection
类实现了 ArrayAccess
$lines->offsetGet($nth);
答案 4 :(得分:-1)
也许不是最好的选择,但是,您可以从集合内部的数组中获取项目
$collection->all()[0]