22

我想我故意提出重复的问题是在打破所有规则......

另一个问题有一个公认的答案。它显然解决了提问者的问题,但它没有回答标题问题。

让我们从头开始 - 该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');

现在,我们是否有任何可靠(最好是简洁)的方法来访问第 n 个项目$keyed

我自己的建议是:

$nth = $keyed->take($n)->last();

但这会在$keyed->last()任何时候给出错误的项目 () $n > $keyed->count()null如果它存在并且它不只是行为,我们如何获得第 n 个项目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 个项目?” 如果对某些人来说更清楚的话。

4

5 回答 5

27

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

$collection->slice($n, 1);
于 2016-11-06T03:35:19.617 回答
10

您可以使用values()以下功能进行尝试:

$collection->values()->get($n);
于 2016-11-06T05:05:16.490 回答
6

根据 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
于 2019-05-03T10:32:06.710 回答
3

你可以使用offsetGet因为Collection类实现ArrayAccess

$lines->offsetGet($nth);
于 2021-08-06T10:45:34.543 回答
1

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

$collection->all()[0] 
于 2018-11-09T17:25:25.757 回答