所有可能的組合我有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