Избегайте глубокого вложения при повторении множества комбинаций - PullRequest
0 голосов
/ 13 мая 2019

Есть ли более декларативный / менее ужасный способ написания этого (намеренно упрощенного) кода?

Я понимаю, что могу использовать ->each(), но это все еще не избавляет от вложенности в этом случае?

Заметьте, мне нужно для генерации всех комбинаций, и у меня есть смесь вещей для циклического перебора - данные конфигурации, обычные массивы, Eloquent, хотя, очевидно, я мог бы их преобразовать первый ...

    foreach(config('app.goals') as $goal) {

      foreach(config('app.age_groups') as $ages) {

        foreach($regions as $region_name => $region_id) {

          foreach($interests->pluck('name')->prepend('') as $interest) {

            foreach(config('app.devices') as $device) {

              $record = new Foo();
              $record->goal = $goal;
              $record->age  = $age;
              $record->region = $region_id;
              $record->interest = $interest;
              $record->device = $device;

              $record->save();

            }
          }
        }
      }
    }

Неясно, может ли помочь метод Коллекция ? например

holygrail(config('app.goals'),config('app.age_groups'),$regions...)->each(function($combination) {
    // logic for every combination
});

1 Ответ

0 голосов
/ 13 мая 2019

crossJoin () , кажется, делает то, что мне нужно, он создает матрицу матрицы для каждой комбинации.

$matrix = collect($goals)->crossJoin(
            $ages,
            $regions,
            $interests,
            $devices
);

Итак, у вас есть массив, полный элементов, каждый из которых имеетперестановка, например:

array(5) {
  [0]=>
  string(5) "REACH"
  [1]=>
  string(5) "18-65"
  [2]=>
  string(9) "Worldwide"
  [3]=>
  string(11) "Programming"
  [4]=>
  string(7) "desktop"
}

Источник Laravel находится в: \ Illuminate \ Support \ Arr :: crossJoin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...