我有两个列表:
- 清单1包含元素(a、b、c、d、e)
- 清单2包含元素(1,2,3)
我必须使用2个阵列的所有元素来计算所有可能的组合:
- 组合1:a1、b2、c3、dNULL、eNULL
- 组合2:a1、bNULL、c2、d3、eNULL
等等。列表的长度是动态的。如何用PHP编写解决此问题所需的函数?
一个简单的嵌套循环可以工作:
$sets = array();
foreach ($list1 as $elm1){
foreach ($list2 as $elm2){
$sets[] = array($elm1, $elm2);
}
}
如果你也需要空版本,请先填充数组:
$max = max(count($list1), count($list2));
$list1 = array_pad($list1, $max, null);
$list2 = array_pad($list2, $max, null);
1——将list1的所有排列都设为X,即更长的列表
2——对于X中的每个元素,在list2 上创建一个映射
3——时间复杂度:X*list2
这被称为"笛卡尔乘积",php数组手册页http://php.net/manual/en/ref.array.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);