2013-03-25 134 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>'; 
} 

?>