Jef*_*eff 2 collections laravel laravel-5.2
我正在寻找一个集合并返回包含集合中两个字段的平面数组.我想要的是:
$collection = new Collection([
[
"a"=>"a1",
"b"=>"b1",
"c"=>"c1"
],
[
"a"=>"a2",
"b"=>"b2",
"c"=>"c2"
],
[
"a"=>"a3",
"b"=>"b3",
"c"=>"c3"
]
]);
//desired output:
[
["a1","b1"],
["a2","b2"],
["a3","b3"]
];
Run Code Online (Sandbox Code Playgroud)
我会认为这是一个功能,但它不是:
$collection->lists(["a","b"]);
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案看起来效率不高,因为它们可能有数千行:
$collection->lists("a")->zip($collection->lists("b"));
Run Code Online (Sandbox Code Playgroud)
有没有我失踪的功能?谢谢.
编辑:我也像这样使用地图:
$collection->map(function($row)){
return [$row['a'],$row['b']];
}
Run Code Online (Sandbox Code Playgroud)
这似乎比我想要的更加习惯.如果没有本地方式,我最终可能会使用此函数为Collection编写包装器.
如果您想要专门使用集合,可以扩展当前的Collections API,因为它是可宏的,执行如下操作:
Collection::macro('pluckMultiple', function ($assoc) {
return $this->map(function ($item) use ($assoc) {
$list = [];
foreach ($assoc as $key) {
$list[$key] = data_get($item, $key);
}
return $list;
}, new static);
});
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我将键作为返回的一部分包含在内,但可以删除它.
$collection->pluckMultiple(['a', 'b']);
Run Code Online (Sandbox Code Playgroud)
会给你你想要的东西.
如果您想从Eloquent集合中提取项目,上述方法可以很好地工作,例如:
$books = Book::with('author')->get();
$books->pluckMultiple(['title', 'author.name', 'author.surname']);
Run Code Online (Sandbox Code Playgroud)
您可以使用
$plucked = $collection->pluck('b','a');
$plucked->all();
Run Code Online (Sandbox Code Playgroud)
这将得到以下结果
Collection {#651 ?
#items: array:3 [?
"a1" => "b1"
"a2" => "b2"
"a3" => "b3"
]}
Run Code Online (Sandbox Code Playgroud)
并使用此代码来获取给定的格式
foreach ($plucked as $key => $item)
{
$temp[] = [ $key, $item];
}
Run Code Online (Sandbox Code Playgroud)
这将给出以下结果.
array:3 [?
0 => array:2 [?
0 => "a1"
1 => "b1"
]
1 => array:2 [?
0 => "a2"
1 => "b2"
]
2 => array:2 [?
0 => "a3"
1 => "b3"
]
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3879 次 |
| 最近记录: |