如何在 PHP 中生成多个数组中项目的所有组合

新手上路,请多包涵

我试图在几个数组中找到项目的所有组合。数组的数量是随机的(可以是 2、3、4、5…)。每个数组中的元素数量也是随机的……

例如,我有 3 个数组:

 $arrayA = array('A1','A2','A3');
$arrayB = array('B1','B2','B3');
$arrayC = array('C1','C2');

我想生成一个包含 3 x 3 x 2 = 18 组合的数组:

  • A1、B1、C1
  • A1、B1、C2
  • A1、B2、C1
  • A1、B2、C2
  • A1、B3、C1
  • A1、B3、C2
  • A2、B1、C1
  • A2, B1, C2 …

问题是创建一个具有可变数量的源数组的函数……

原文由 Yohan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 377
2 个回答

这是递归解决方案:

 function combinations($arrays, $i = 0) {
    if (!isset($arrays[$i])) {
        return array();
    }
    if ($i == count($arrays) - 1) {
        return $arrays[$i];
    }

    // get combinations from subsequent arrays
    $tmp = combinations($arrays, $i + 1);

    $result = array();

    // concat each array from tmp with each element from $arrays[$i]
    foreach ($arrays[$i] as $v) {
        foreach ($tmp as $t) {
            $result[] = is_array($t) ?
                array_merge(array($v), $t) :
                array($v, $t);
        }
    }

    return $result;
}

print_r(
    combinations(
        array(
            array('A1','A2','A3'),
            array('B1','B2','B3'),
            array('C1','C2')
        )
    )
);

原文由 Krzysztof 发布,翻译遵循 CC BY-SA 3.0 许可协议

此代码除了简单之外,还获取多个数组的所有组合并保留键。

 function get_combinations($arrays) {
    $result = array(array());
    foreach ($arrays as $property => $property_values) {
        $tmp = array();
        foreach ($result as $result_item) {
            foreach ($property_values as $property_key => $property_value) {
                $tmp[] = $result_item + array($property_key => $property_value);
            }
        }
        $result = $tmp;
    }
    return $result;
}

例子:

 Array
(
    Array
    (
        '1' => 'White',
        '2' => 'Green',
        '3' => 'Blue'
    ),
    Array
    (
        '4' =>' Small',
        '5' => 'Big'
    )
)

将返回:

 Array
(
    [0] => Array
    (
        [1] => White
        [4] =>  Small
    )
    [1] => Array
    (
        [1] => White
        [5] => Big
    )
    [2] => Array
    (
        [2] => Green
        [4] =>  Small
    )
    [3] => Array
    (
        [2] => Green
        [5] => Big
    )
    [4] => Array
    (
        [3] => Blue
        [4] =>  Small
    )
    [5] => Array
    (
        [3] => Blue
        [5] => Big
    )
)

原文由 Guilhermo Luna 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏