如何用laravel系列优雅地完成以下工作?
将 $ baseMap 的值映射为集合的键。
baseMap:
$baseMap = [
'name' => 'new_name',
'year' => 'new_year',
];
集合:
$items = collect([
[
'name' => 'name1',
'year' => '1000',
'not_in_basemap' => 'foo'
],
[
'name' => 'name2',
'year' => '2000',
'not_in_basemap' => 'foo'
],
//...
]);
最终结果:
$result =[
[
'new_name' => 'name1',
'new_year' => '1000',
],
[
'new_name'=> 'name2',
'new_year' => '2000',
],
];
我知道如何用纯PHP做到这一点,只是想知道什么是一个不错的收集版本。谢谢!
答案 0 :(得分:2)
使用intersectByKeys用$items
值过滤baseMap键。
$result = $items->map(function($item,$key) use ($baseMap){
return array_combine(array_values($baseMap),collect($item)->intersectByKeys($baseMap)->all());
});
dd($result);
更新:
以纯粹的收集方式,
$baseMapCollect = collect($baseMap);
$result = $items->map(function($item,$key) use ($baseMapCollect){
return $baseMapCollect->values()->combine(collect($item)->intersectByKeys($baseMapCollect->all())->values())->all();
});
dd($result);
答案 1 :(得分:2)
我试图找到收集方法或php函数,但没有成功。一些肮脏的代码可以从两侧使用不同的键(项目和底图)。
$result = $items->map(function($item) use ($baseMap) {
$array = [];
foreach($baseMap as $oldKey => $newKey){
if(isset($item[$oldKey])){
$array[$newKey] = $item[$oldKey];
}
}
return $array;
});
$result = $result->toArray();
答案 2 :(得分:2)
感谢@ vivek_23和@IndianCoding给我的主意,我得出以下结论: 我进行了少量修改,以确保映射和项目键对齐。 这样您就不必担心未对准以及所有laravel集合中的问题!
$baseMap = collect($baseMap)->sortKeys();
$result = $items->map(function ($item) use ($baseMap) {
return $baseMap->values()
->combine(
collect($item)->sortKeys()->intersectByKeys($baseMap)
)
->all();
});
答案 3 :(得分:0)
这是我的两分钱,使用map
。不知道您的集合应该有多动态,但是知道键之后,我将执行以下操作:
$baseMap = [
'name' => 'new_name',
'year' => 'new_year',
];
$items = collect([
[
'name' => 'name1',
'year' => '1000',
'not_in_basemap' => 'foo'
],
[
'name' => 'name2',
'year' => '2000',
'not_in_basemap' => 'foo'
],
])->map(function($item, $key) use ($baseMap) {
return [
$baseMap['name'] => $item['name'],
$baseMap['year'] => $item['year']
];
});