所有可能的组合我有2所列出:获得的2所列出
- List1中具有元素(A,B,C,d,E)
- 列表2具有元件(1,2,3)
我必须计算使用2个数组中的所有元素的所有可能的组合:
- Combinaton 1:A1,B2,C3,dNULL,ENULL
- 组合2:a1,bNULL,c2,d3,eNULL
依此类推。列表的长度是动态的。如何编写解决此问题所需的PHP函数?
所有可能的组合我有2所列出:获得的2所列出
我必须计算使用2个数组中的所有元素的所有可能的组合:
依此类推。列表的长度是动态的。如何编写解决此问题所需的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);
一个简单的嵌套循环的工作原理:
$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);
谢谢你的帮助。但这真的没有帮助。每个组合都应配对所有元素。不只是数组中的一个元素。 – user1305579 2012-04-01 17:41:48
我不明白你的意思。你能给出一个预期产出的完整例子吗? – Cal 2012-04-02 19:41:10
1 - 获取列表1为X,长列表
2--用于X的每个元素的所有排列,创建列表2映射
3 - 时间复杂性:X * list2
我假设较短的列表将填充'null'值,对吧? – Gumbo 2012-03-31 22:12:57