获得2个列表的所有可能组合

时间:2012-03-31 22:09:53

标签: php

我有2个名单:

  • List1具有元素(a,b,c,d,e)
  • List2具有元素(1,2,3)

我必须使用2个数组的所有元素计算所有可能的组合:

  • 组合1:a1,b2,c3,dNULL,eNULL
  • 组合2:a1,bNULL,c2,d3,eNULL

等等。列表的长度是动态的。如何用PHP编写函数来解决这个问题?

3 个答案:

答案 0 :(得分:1)

一个简单的嵌套循环起作用:

$sets = array();
foreach ($list1 as $elm1){
    foreach ($list2 as $elm2){
        $sets[] = array($elm1, $elm2);
    }
}

如果您也需要null版本,请先填充数组:

$max = max(count($list1), count($list2));
$list1 = array_pad($list1, $max, null);
$list2 = array_pad($list2, $max, null);

答案 1 :(得分:0)

这被称为“笛卡尔积”,数组http://php.net/manual/en/ref.array.php上的php手册页显示了一些实现(在注释中)。

function array_cartesian() {
    $_ = func_get_args();
    if(count($_) == 0)
        return array(array());
    $a = array_shift($_);
    $c = call_user_func_array(__FUNCTION__, $_);
    $r = array();
    foreach($a as $v)
        foreach($c as $p)
            $r[] = array_merge(array($v), $p);
    return $r;
}

示例:

$cross = array_cartesian(
    array('apples', 'pears',  'oranges'),
    array('steve', 'bob')
);

要查看输出:

print_r($cross);

答案 2 :(得分:0)

1 - 将list1的所有排列设为X,更长的列表

2--对于X中的每个元素,在list2上创建一个映射

3 - 时间复杂度:X * list2