将数组值映射到 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();
        });