如何创建一个没有循环的多维数组?

问题描述:

我有一个包含三组复选框的表单:浇头,尺寸,修饰符。提交时,每个都返回一个值数组。我最终需要做的是为数据库中的每一个可能的组合创建一个单独的记录。如何创建一个没有循环的多维数组?

实施例:

[15-Jul-2016 11:47:29] topps 
[15-Jul-2016 11:47:29] Array 
(
    [0] => B 
    [1] => K 
    [2] => KT 
    [3] => ME 
    [4] => PK 
) 

[15-Jul-2016 11:47:29] mods 
[15-Jul-2016 11:47:29] Array 
(
    [0] => R 
) 

[15-Jul-2016 11:47:29] sizes 
[15-Jul-2016 11:47:29] Array 
(
    [0] => 7I 
    [1] => FM 
    [2] => L 
    [3] => LP 
    [4] => NL 
) 

我需要创建用于B R - 7I,; B R FM,B R L等的Kr 7I,Kr的FM的记录,等等。我想必须首先是一个数组,看起来像这样:

$records = array(
    array('B', 'R', '7I'), 
    array('B', 'R', 'FM'), 
    // and so on 
); 

我不是超级熟悉PHP的阵列功能(array_walkarray_map等)

有没有什么办法可以生成我想要的数组而不需要做嵌套循环?

+2

是的,但是......为什么? –

+0

重复:http://*.com/questions/8567082/how-to-generate-in-php-all-combinations-of-items-in-multiple-arrays 编辑:对不起,这个问题没有答案没有循环 – mulquin

+2

为什么没有循环?要么使用循环,要么你必须事先写出所有可能的组合。而在内部,array_walk/array_map使用循环ANYWAYS。 –

你可以在PHP中使用直接array_walk

$topps = ['B', 'K', 'KT', 'ME', 'PK']; 
$mods = ['R']; 
$sizes = ['7I', 'FM', 'L', 'LP', 'NL']; 

$result = []; 

// use maddness 
array_walk($topps, function($topp)use($mods, $sizes, &$result) { 
    array_walk($mods, function($mod)use($topp, $sizes, &$result) { 
     array_walk($sizes, function($size)use($topp, $mod, &$result) { 
      $result[] = [$topp, $mod, $size]; 
     }); 
    }); 
}); 
var_dump($result); 

由于封闭系统的看到使用的疯狂。你可以通过使用类来缓解,但是有类的开销。

// class 
class arrayGenerator { 

    private $topps, $mods, $sizes; 
    private $result; 

    function __construct($topps, $mods, $sizes) { 
     $this->topps = $topps; 
     $this->mods = $mods; 
     $this->sizes = $sizes; 
    } 

    function generate($topps, $mods, $sizes) { 
     $this->result = []; 
     array_walk($this->topps, function($topp) { 
      array_walk($this->mods, function($mod)use($topp) { 
       array_walk($this->sizes, function($size)use($topp, $mod) { 
        $this->result[] = [$topp, $mod, $size]; 
       }); 
      }); 
     }); 
     return $this->result; 
    } 

} 

$generator = new arrayGenerator($topps, $mods, $sizes); 
$result = $generator->generate(); 
var_dump($result);