将数组值映射到 collection 个项目
Map array values to collection of items
如何使用 laravel collection 优雅地执行以下操作?
将 $baseMap 的值映射为 collection.
的键
底图:
$baseMap = [
'name' => 'new_name',
'year' => 'new_year',
];
collection :
$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 ,只是想知道 collection 版本会是什么样子。谢谢!
这是我的两分钱,使用 map
。不知道您的 collection 应该有多动态,但知道我会执行以下操作的键:
$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']
];
});
使用 intersectByKeys 过滤具有 $items
个值的 baseMap 键。
$result = $items->map(function($item,$key) use ($baseMap){
return array_combine(array_values($baseMap),collect($item)->intersectByKeys($baseMap)->all());
});
dd($result);
更新:
以纯粹的collection方式,
$baseMapCollect = collect($baseMap);
$result = $items->map(function($item,$key) use ($baseMapCollect){
return $baseMapCollect->values()->combine(collect($item)->intersectByKeys($baseMapCollect->all())->values())->all();
});
dd($result);
我试图找到收集方法或 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();
感谢@vivek_23 和@IndianCoding 给我想法,我最终得到了以下结果:
我做了一个小的编辑以确保映射和项目键对齐。
所以你不必担心错位和所有 laravel collection !
$baseMap = collect($baseMap)->sortKeys();
$result = $items->map(function ($item) use ($baseMap) {
return $baseMap->values()
->combine(
collect($item)->sortKeys()->intersectByKeys($baseMap)
)
->all();
});
如何使用 laravel collection 优雅地执行以下操作?
将 $baseMap 的值映射为 collection.
的键底图:
$baseMap = [
'name' => 'new_name',
'year' => 'new_year',
];
collection :
$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 ,只是想知道 collection 版本会是什么样子。谢谢!
这是我的两分钱,使用 map
。不知道您的 collection 应该有多动态,但知道我会执行以下操作的键:
$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']
];
});
使用 intersectByKeys 过滤具有 $items
个值的 baseMap 键。
$result = $items->map(function($item,$key) use ($baseMap){
return array_combine(array_values($baseMap),collect($item)->intersectByKeys($baseMap)->all());
});
dd($result);
更新:
以纯粹的collection方式,
$baseMapCollect = collect($baseMap);
$result = $items->map(function($item,$key) use ($baseMapCollect){
return $baseMapCollect->values()->combine(collect($item)->intersectByKeys($baseMapCollect->all())->values())->all();
});
dd($result);
我试图找到收集方法或 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();
感谢@vivek_23 和@IndianCoding 给我想法,我最终得到了以下结果: 我做了一个小的编辑以确保映射和项目键对齐。 所以你不必担心错位和所有 laravel collection !
$baseMap = collect($baseMap)->sortKeys();
$result = $items->map(function ($item) use ($baseMap) {
return $baseMap->values()
->combine(
collect($item)->sortKeys()->intersectByKeys($baseMap)
)
->all();
});