Сопоставить значения массива с коллекцией элементов - PullRequest
2 голосов
/ 29 мая 2019

Как можно было бы элегантно сделать следующее с коллекциями Laravel?

Сопоставить значения $ 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 ]

2 голосов
/ 29 мая 2019

Спасибо @ 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();
        });
2 голосов
/ 29 мая 2019

Используйте intersectByKeys для фильтрации ключей baseMap по значениям $items.

$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);
2 голосов
/ 29 мая 2019

Я пытался найти методы сбора или функции 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();
0 голосов
/ 29 мая 2019

Вот мои два цента, используя 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']
        ];
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...