如何访问Laravel集合中的第n个项目?

时间:2016-11-06 00:23:30

标签: laravel laravel-collection

我想我是故意制造一个重复的问题而违反所有规则......

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个项目?"如果对某些人来说更清楚。

5 个答案:

答案 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]