我有一个像这样的Laravel集合(近似使用数组语法;实际数据是从API响应中获得的object
中的Collection
,而不是本地DB):
$rows = [
[
'id': 1,
'name': 'Sue',
'age': 23,
],
[
'id': 2,
'name': 'Joe',
'age': 25,
],
]
我想提取字段的一个子集:
$subset = [];
foreach ($rows as $row) {
$subset[] = ['name' => $row['name'], 'age' => $row['age']];
}
最后是:
$subset = [
[
'name': 'Sue',
'age': 23,
],
[
'name': 'Joe',
'age': 25,
],
]
我应该使用什么Collection
方法来实现而不是for
循环?
我发现了这个建议,使用高阶消息,这是有意义的:
$subset = $rows->map->only(['name', 'age']);
,但这只是给了我一个null
值的Collection
。将其扩展到传统的map
调用中也产生了同样的效果。我觉得我想要某种multipluck
,但我不确定这对应什么!
更新事实证明,我用高阶map->only
方法正确地做到了这一点。然而,虽然我的集合中的项目是一种Model
,但它们不是LaravelModel
类的子类或兼容实现,并且缺乏only
方法的实现。作者添加了这个方法,现在可以正常工作了。
你很接近,但你不链map
和only
,only
似乎不能在嵌套的array
s/object
s的集合上工作。
因此,对于您的情况,使用map()
与Callback:
$rows = collect([
(object)[
'id' => 1,
'name' => 'Sue',
'age' => 23,
],
(object)[
'id' => 2,
'name' => 'Joe',
'age' => 25,
]
]);
$mapped = $rows->map(function ($row) {
return ['age' => $row->age, 'name' => $row->name];
});
dd($mapped->toArray());
输出将是:
array:2 [▼
0 => array:2 [▼
"age" => 23
"name" => "Sue"
]
1 => array:2 [▼
"age" => 25
"name" => "Joe"
]
]
注意:如果这些是array
s而不是object
s,那么你应该做$row['age']
和$row['name']
而不是$row->age
和$row->name
。在Laravel中,模型都是,并且允许任意一种语法。
引用:
https://laravel.com/docs/9.x/collections method-map
https://laravel.com/docs/9.x/collections方法只编辑:
一些替代品。如果您有Collection
或Model
s,那么您可以本地执行:
$mapped = $rows->map(function ($model) {
return $model->only(['age', 'name']);
});
如果你有一个Collection
的Collection
s,那么你可以这样做:
$mapped = $rows->map(function ($collection) {
return $collection->only(['age', 'name']);
});
最后,如果您array
s或object
s,您可以collect()
并调用->only()
:
$mapped = $rows->map(function ($row) {
return collect($row)->only(['age', 'name']);
});