2012-03-31 42 views
0

所有可能的组合我有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函数?

+0

我假设较短的列表将填充'null'值,对吧? – Gumbo 2012-03-31 22:12:57

回答

0

这被称为“笛卡尔产品”,数组上的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); 
+0

一组不是两个列表。 – Gumbo 2012-03-31 22:15:40

+0

所以,我已经更新了我的答案。 – msigman 2012-03-31 22:20:58

+0

offtop:'$ _'是有史以来最好的变量名称。 – meze 2012-03-31 22:29:58

1

一个简单的嵌套循环的工作原理:

$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); 
+0

谢谢你的帮助。但这真的没有帮助。每个组合都应配对所有元素。不只是数组中的一个元素。 – user1305579 2012-04-01 17:41:48

+0

我不明白你的意思。你能给出一个预期产出的完整例子吗? – Cal 2012-04-02 19:41:10

0

1 - 获取列表1为X,长列表

2--用于X的每个元素的所有排列,创建列表2映射

3 - 时间复杂性:X * list2