25

我有一个 laravel 集合对象。

我想在其中使用第 n 个模型。

我如何访问它?

编辑:

我在laravel 文档中找不到合适的方法。我可以在 foreach 循环中迭代集合并在找到第 n 个项目时中断:

foreach($collection as $key => $object)
{
    if($key == $nth) {break;}
}
// $object is now the nth one

但这似乎很混乱。

更简洁的方法是执行一次上述循环并创建一个包含集合中所有对象的简单数组。但这似乎是不必要的重复。

laravel 集合类文档中,有一个 fetch 方法,但我认为这会从与主键匹配的集合中获取一个对象,而不是集合中的第 n 个对象。

4

4 回答 4

53

看到作为Illuminate\Support\Collectionimplements ArrayAccess,您应该能够简单地使用方括号表示法,即

$collection[$nth]

这在内部调用offsetGet,您也可以使用

$collection->offsetGet($nth)

最后,您可以使用get允许可选默认值的方法

$collection->get($nth)
// or
$collection->get($nth, 'some default value')
于 2014-06-27T04:35:02.523 回答
12

@Phil 的答案并没有完全获得第 n 个元素,因为键可能是无序的。如果您从 db 查询中获得了一个雄辩的集合,它会正常工作,但如果您的键不是连续的,那么您需要做一些不同的事情。

$collection = collect([0 => 'bish', 2 => 'bash']); $collection[1] // Undefined index

相反,我们可以做$collection->values()[1] // string(4) bash which usesarray_values()

或者甚至制作一个宏来执行此操作:

Collection::macro('nthElement', function($offset, $default = null) {
    return $this->values()->get($offset, $default);
}):

宏用法示例:

$collection = collect([0 => 'bish', 2 => 'bash']);
$collection->nthElement(1) // string(4) 'bash'
$collection->nthElement(3) // undefined index
$collection->nthElement(3, 'bosh') // string (4) bosh
于 2017-05-05T09:39:05.950 回答
2

我迟到了这个问题,但我认为这对某人来说可能是一个有用的解决方案。

集合具有带有以下参数的 slice 方法:

 $items->slice(whereToStartSlice, sizeOfSlice);

因此,如果您将 whereToStartSlice 参数设置为第 n 个项目并将 sizeOfSlice 设置为 1,您将检索第 n 个项目。

例子:

 $nthItem = $items->slice($nth,1);
于 2021-09-28T15:03:25.047 回答
1

如果您在排序后保留索引的集合有问题......您可以从该集合的值中创建一个新集合,并尝试访问新索引的集合,就像您期望的那样:

例如,获取收藏中价格第二高的商品

$items = collect(
                 [
                  "1" => ["name" => "baseball", "price" => 5],
                  "2" => ["name"=> "bat", "price" => 15],
                  "3" => ["name" => "glove", "price" => 10]
                 ]
                );

collect($items->sortByDesc("price")->values())[1]["name"];

// Result: glove

类似于变形答案但不一样。简单地values()在排序之后使用不会给您预期的结果,因为索引仍然与每个项目耦合。

感谢 @howtomakeaturn 在 Laravel Github 上提供此解决方案: https ://github.com/laravel/framework/issues/1335

于 2019-09-06T19:17:21.097 回答