如何访问Laravelcollection中的第n项?

How to access the nth item in a Laravel collection?

我想我故意做一个重复的问题违反了所有规则...

other question 有一个可接受的答案。明明解决了提问者的问题,却没有回答题主的问题

让我们从头开始——first()方法的实现大致是这样的:

foreach ($collection as $item)
    return $item;

它显然比采用 $collection[0] 或使用其他建议的方法更可靠。

可能没有索引为 0 或索引为 15 的项目,即使 collection 中有 20 个项目。为了说明问题,让我们从文档中取出 collection:

$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();

但这会在 $n > $keyed->count() 时给出错误的项目 ($keyed->last())。如果第 n 个项目存在,我们如何获得它?如果它不符合 first() 的行为,我们如何获得 null

编辑

为了澄清,让我们考虑这个 collection:

$col = collect([
    2 => 'a',
    5 => 'b',
    6 => 'c',
    7 => 'd']);

第一项是 $col->first()。如何获得第二个?

$col->nth(3) 应该 return 'c'(或者 'c' 如果基于 0,但这将与 first() 不一致)。 $col[3] 不会工作,它只会 return 一个错误。

$col->nth(7)应该returnnull因为没有第七项,只有四项。 $col[7] 行不通,它只会 return 'd'.

如果对某些人来说更清楚,您可以将问题改写为 "How to get nth item in the foreach order?"。

我想更快更节省内存的方法是使用 slice() 方法:

$collection->slice($n, 1);

您可以尝试使用 values() 函数作为:

$collection->values()->get($n);

也许不是最好的选择,但是,您可以从集合中的数组中获取项目

$collection->all()[0] 

根据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

您可以使用 offsetGet,因为 Collection class 实现了 ArrayAccess

$lines->offsetGet($nth);