2012-03-31 84 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