通过它的键获得 collection 项
Get a collection item by it's key
我有一个 Cake\Collection\Collection
:
object(Cake\Collection\Collection) {
'count' => (int) 5
}
当我调试它的 toArray()
输出时,我可以看到它包含一个带有特定键的项目(比如,123)。那么,如果我想直接通过该键获取项目,而不将 collection 转换为数组怎么办?
- 我查看了 /3.7/class-Cake.Collection.Collection.html,但找不到任何看起来像普通 getter 的东西。
$collection[1234]
(当然)抛出 致命错误:无法将 Cake\Collection\Collection 类型的 object 用作数组
$collection->get(123)
抛出 致命错误:调用未定义的方法 ArrayIterator::get()
所以我 searched for CakePHP ArrayIterator, found the built-in PHP ArrayIterator
class; it has ArrayIterator::offsetGet( mixed $index )
,实际上是 $collection->offsetGet(123)
。
然而,上面的collection doc page没有提到ArrayIterator
,所以这感觉像是未记录的CakePHP 用法。我做对了吗?否则,我如何通过它的键获取 collection 项目?
考虑到 collections 的工作方式,您不能像在数组中那样访问键,必须首先评估 collection 及其所有过滤器、聚合器和其他东西,并且然后可以查一个key
我不知道为什么没有 shorthand 通过其键获取项目的方法,可能是因为每个 collection 都不一样,界面不应该太混乱,但是有一些方法可以按键过滤 collection:
$value = $collection
->filter(function ($value, $key) {
return $key === 123;
})
->first();
那将 return collection 中的第一项,键为 123
。
不鼓励使用 offsetGet()
(或与此相关的任何其他内部迭代器方法),因为它不会评估 collection!比如说你的 collection 上有一个过滤器可以减少它,这样就不再有 123
键了,使用 offsetGet()
它仍然会 return 一个值:
$collection = collection([123 => 'foo', 'abc' => 'baz']);
$filtered = $collection
->filter(function ($value, $key) {
return $key === 'abc';
});
$value = $filtered->offsetGet(123);
debug($value);
$values = $filtered->toArray();
debug($values);
人们会期望 $value
是 null
,因为 collection 有一个过滤器只包含名为 abc
的键,但 offsetGet(123)
会对未过滤的数据进行操作,仍然 return 123
键的值。
########## DEBUG ##########
'foo'
###########################
########## DEBUG ##########
[
'abc' => 'baz'
]
###########################
我有一个 Cake\Collection\Collection
:
object(Cake\Collection\Collection) {
'count' => (int) 5
}
当我调试它的 toArray()
输出时,我可以看到它包含一个带有特定键的项目(比如,123)。那么,如果我想直接通过该键获取项目,而不将 collection 转换为数组怎么办?
- 我查看了 /3.7/class-Cake.Collection.Collection.html,但找不到任何看起来像普通 getter 的东西。
$collection[1234]
(当然)抛出 致命错误:无法将 Cake\Collection\Collection 类型的 object 用作数组$collection->get(123)
抛出 致命错误:调用未定义的方法 ArrayIterator::get()
所以我 searched for CakePHP ArrayIterator, found the built-in PHP ArrayIterator
class; it has ArrayIterator::offsetGet( mixed $index )
,实际上是 $collection->offsetGet(123)
。
然而,上面的collection doc page没有提到ArrayIterator
,所以这感觉像是未记录的CakePHP 用法。我做对了吗?否则,我如何通过它的键获取 collection 项目?
考虑到 collections 的工作方式,您不能像在数组中那样访问键,必须首先评估 collection 及其所有过滤器、聚合器和其他东西,并且然后可以查一个key
我不知道为什么没有 shorthand 通过其键获取项目的方法,可能是因为每个 collection 都不一样,界面不应该太混乱,但是有一些方法可以按键过滤 collection:
$value = $collection
->filter(function ($value, $key) {
return $key === 123;
})
->first();
那将 return collection 中的第一项,键为 123
。
不鼓励使用 offsetGet()
(或与此相关的任何其他内部迭代器方法),因为它不会评估 collection!比如说你的 collection 上有一个过滤器可以减少它,这样就不再有 123
键了,使用 offsetGet()
它仍然会 return 一个值:
$collection = collection([123 => 'foo', 'abc' => 'baz']);
$filtered = $collection
->filter(function ($value, $key) {
return $key === 'abc';
});
$value = $filtered->offsetGet(123);
debug($value);
$values = $filtered->toArray();
debug($values);
人们会期望 $value
是 null
,因为 collection 有一个过滤器只包含名为 abc
的键,但 offsetGet(123)
会对未过滤的数据进行操作,仍然 return 123
键的值。
########## DEBUG ##########
'foo'
###########################
########## DEBUG ##########
[
'abc' => 'baz'
]
###########################