在PHP中查找数组元素的所有可能的唯一组合[重复]
Posted
技术标签:
【中文标题】在PHP中查找数组元素的所有可能的唯一组合[重复]【英文标题】:Find all possible unique combinations of elements of an array in PHP [duplicate] 【发布时间】:2013-03-15 12:23:04 【问题描述】:我知道有几个问题涉及这个主题(例如here),但没有一个(至少从我发现的)能满足我的需要。
假设我有一个包含 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]
排除与[1, 2, 3]
相同的子集,如[3, 2, 1]
或[2, 1, 3]
。
我怎样才能做到这一点?
【问题讨论】:
@JohnConde 这不是重复的,因为它不包括AA, BB, CC, AAA, BBB, CCC
案例。
@Alex 是只有 3 个元素还是会有更多元素?
[1, 1, 1, 1, 1, 1, 1, 1, 1]
是“子集”吗?
属于[1, 2, 3]
?看不出来怎么可能。但它是[1, 2, 3, 4, 5, 6, 7, 8, 9]
的子集。
我的数学很模糊 - 你是要一个 powerset 还是这有点不同?
【参考方案1】:
使用递归的快速解决方案,可能不是最好的方法,但它可以完成工作。
<?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>';
?>
【讨论】:
以上是关于在PHP中查找数组元素的所有可能的唯一组合[重复]的主要内容,如果未能解决你的问题,请参考以下文章