繁体   English   中英

如何访问Laravel集合对象中的第n个对象?

[英]How to access the nth object in a Laravel collection object?

我有一个laravel集合对象。

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

我该如何访问它?

编辑:

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

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

但这看起来很混乱。

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

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

看作Illuminate\\Support\\Collection实现ArrayAccess ,你应该能够简单地使用方括号表示法,即

$collection[$nth]

offsetGet内部调用offsetGet ,您也可以使用它

$collection->offsetGet($nth)

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

$collection->get($nth)
// or
$collection->get($nth, 'some default value')

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

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

相反,我们可以使用$collection->values()[1] // string(4) bash使用array_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

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

例如,在集合中获得价格第二高的商品

$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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM