2016-07-15 64 views
0

我有一個包含三組複選框的表單:澆頭,尺寸,修飾符。提交時,每個都返回一個值數組。我最終需要做的是爲數據庫中的每一個可能的組合創建一個單獨的記錄。如何創建一個沒有循環的多維數組?

實施例:

[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://stackoverflow.com/questions/8567082/how-to-generate-in-php-all-combinations-of-items-in-multiple-arrays 編輯:對不起,這個問題沒有答案沒有循環 – mulquin

+2

爲什麼沒有循環?要麼使用循環,要麼你必須事先寫出所有可能的組合。而在內部,array_walk/array_map使用循環ANYWAYS。 –

回答

0

你可以在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);