通过它的键获得 collection 项

Get a collection item by it's key

我有一个 Cake\Collection\Collection:

object(Cake\Collection\Collection) {

    'count' => (int) 5

}

当我调试它的 toArray() 输出时,我可以看到它包含一个带有特定键的项目(比如,123)。那么,如果我想直接通过该键获取项目,而不将 collection 转换为数组怎么办?

所以我 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);

人们会期望 $valuenull,因为 collection 有一个过滤器只包含名为 abc 的键,但 offsetGet(123) 会对未过滤的数据进行操作,仍然 return 123 键的值。

########## DEBUG ##########
'foo'
###########################

########## DEBUG ##########
[
    'abc' => 'baz'
]
###########################