PHP生成像prestashop这样的组合

时间:2018-02-03 23:49:32

标签: php loops multidimensional-array combinations

我想管理我的阵列,但我不知道该怎么做。

当我添加产品时,我可以选择许多属性,如颜色,大小。有时我有两个以上的属性。

$table = array(
    'color' => array('1', '2'),
    'size' => array('37', '38'),
    'other' => array('a', 'b'),
    ...
);

我正在寻找的是得到这个结果:

$table = array(
    '0' => array('1', '37','a'),
    '1' => array('1', '37','b'),
    '2' => array('1', '38','a'),
    '3' => array('1', '38','b'),
    '4' => array('2', '37','a'),
    '5' => array('2', '37','b'),
    '6' => array('2', '38','a'),
    '7' => array('2', '38','b'),
);    

1 个答案:

答案 0 :(得分:1)

以下是生成属性列表及其选项的所有组合的一种方法:

function generateCombinations(array $attributes)
{
    $combinations = array(array());
    foreach ($attributes as $options) {
        $new_combinations = array();
        foreach ($combinations as $combination) {
            foreach ($options as $option) {
                $new_combination = $combination;
                $new_combination[] = $option;
                $new_combinations[] = $new_combination;
            }
        }
        $combinations = $new_combinations;
    }
    return $combinations;
}

它通过迭代建立每个属性的组合列表来工作:

initialise: [[]]
1st attribute: [[1],[2]]
2nd attribute: [[1,37],[1,38],[2,37],[2,38]]
3rd attribute: [[1,37,a],[1,37,b],[1,38,a],[1,38,b],[2,37,a],[2,37,b],[2,38,a],[2,38,b]]
... and so on if there are additional attributes

您可以使用示例数据调用该函数,如下所示:

$table = array(
    'color' => array('1', '2'),
    'size' => array('37', '38'),
    'other' => array('a', 'b'),
);
$combinations = generateCombinations($table);
var_dump($combinations);

其中给出了以下输出(使用php 5.6测试):

array(8) {
  [0]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(2) "37"
    [2]=>
    string(1) "a"
  }
  [1]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(2) "37"
    [2]=>
    string(1) "b"
  }
// 6 other rows omitted ...