遍历许多组合时避免深层嵌套

时间:2019-05-13 11:33:57

标签: php laravel

编写这种(故意简化的)代码是否有一种更具声明性/不太可怕的方式?

我知道我可以使用->each(),但是在这种情况下仍然不能摆脱嵌套吗?

请注意,我确实需要来生成所有组合,并且我需要混合使用各种东西-配置数据,普通数组,口才,尽管显然我可以首先将它们转换...

    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();

            }
          }
        }
      }
    }

不清楚是否有可以帮助您的Collection方法?例如

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

1 个答案:

答案 0 :(得分:0)

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