如何在不循环的情况下创建多维数组?

时间:2016-07-15 16:59:01

标签: php arrays multidimensional-array

我有一个包含三组复选框的表单:Toppings,Sizes,Modifiers。提交时,每个都返回一个值数组。我最终需要做的是在数据库中为三者中的每个可能组合创建一个单独的记录。

示例:

[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等创建记录.K R 7I,K R FM等。我想要开始的是一个看起来像这样的数组:

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

我不太熟悉PHP中的数组函数(array_walkarray_map等)。

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

1 个答案:

答案 0 :(得分:0)

您可以直接使用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);

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

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