2013-03-25 115 views
0

我知道涉及此主題的幾個問題(例如here),但是他們都沒有(至少從我發現的)做我需要的。在PHP中查找數組元素的所有可能的唯一組合

假設我有一個3個元素[1, 2, 3]的數組。我需要找到所有可能的獨特組合(因此排除排列,如here),包括重複元素的組合。所以結果應該是:

[1] 
[2] 
[3] 
[1, 1] 
[1, 2] 
[1, 3] 
[2, 2] 
[2, 3] 
[3, 3] 
[1, 1, 1] 
[1, 1, 2] 
[1, 1, 3] 
[1, 2, 2] 
[1, 2, 3] 
[1, 3, 3] 
[2, 2, 2] 
[2, 2, 3] 
[2, 3, 3] 
[3, 3, 3] 

剔除亞像[3, 2, 1][2, 1, 3],是同樣的事情[1, 2, 3]

我該如何做到這一點?

+0

@JohnConde它不是重複的,因爲它不包括'AA,BB,CC,AAA,BBB,CCC'的情況。 – Alex 2013-03-25 21:11:21

+0

@Alex只有3個元素,還是會有更多元素? – HamZa 2013-03-25 21:18:50

+1

是「[1,1,1,1,1,1,1,1,1]」一個子集「? – Koterpillar 2013-03-25 21:35:15

回答

4

使用遞歸的快速解決方案,可能不是最好的方法,但它可以完成工作。

<?php 

$arr = array(1,2,3); 
$result = array(); 

function combinations($arr, $level, &$result, $curr=array()) { 
    for($i = 0; $i < count($arr); $i++) { 
     $new = array_merge($curr, array($arr[$i])); 
     if($level == 1) { 
      sort($new); 
      if (!in_array($new, $result)) { 
       $result[] = $new;   
      } 
     } else { 
      combinations($arr, $level - 1, $result, $new); 
     } 
    } 
} 
for ($i = 0; $i<count($arr); $i++) { 
    combinations($arr, $i+1, $result); 
} 

// TEST 
foreach ($result as $arr) { 
    echo join(" ", $arr) . '<br>'; 
} 

?> 
相關問題