如何访问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);
我想我故意做一个重复的问题违反了所有规则...
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);