将数组值映射到项目集合

时间:2019-05-29 12:16:57

标签: laravel laravel-5.7

如何用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做到这一点,只是想知道什么是一个不错的收集版本。谢谢!

4 个答案:

答案 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']
        ];
  });