我有一个表示键中允许值的数组。这个数组的长度是动态的
array(
10=>array(100,101,102),
11=>array(100,104),
12=>array(100,102,103)
)
在这个例子中,键10可以有100,101和102.
我希望获得所有有效组合,其中每个值只出现一次
array(
array(10=>array(100,101,102),11=>array(104),12=>array(103)),
array(10=>array(100,101),10=>array(104),12=>array(102,103)),
array(10=>array(101),10=>array(100,104),12=>array(102,103)),
array(10=>array(101),10=>array(104),12=>array(100,102,103)),
AND SO ON
)
答案 0 :(得分:0)
他们希望您为每个索引找到power sets,然后计算这些集的功率集。
此代码允许您计算每个索引的功率集。它应该让你开始并让你知道如何完成其余的问题。
function power_set($arr)
{
$sets = [];
for ($i = 0; $i < pow(2, count($arr)); $i++) {
$set = [];
for ($j = 0; $j < count($arr); $j++) {
if ($i & (1 << $j)) {
$set[] = $arr[$j];
}
}
if (count($set) > 0) {
$sets[] = $set;
}
$set = [];
}
return $sets;
}
输出
array(7) {
[0] =>
array(1) {
[0] =>
int(100)
}
[1] =>
array(1) {
[0] =>
int(101)
}
[2] =>
array(2) {
[0] =>
int(100)
[1] =>
int(101)
}
[3] =>
array(1) {
[0] =>
int(102)
}
[4] =>
array(2) {
[0] =>
int(100)
[1] =>
int(102)
}
[5] =>
array(2) {
[0] =>
int(101)
[1] =>
int(102)
}
[6] =>
array(3) {
[0] =>
int(100)
[1] =>
int(101)
[2] =>
int(102)
}
}
我注意到的一件事是,你不包括集合没有元素的情况。技术上应该包括在内,所以我会检查以确保您的样本输出是正确的。我修改了算法以排除这种情况,但我认为应该包括它。
如果要包含它,请删除检查$set
中元素数量的if语句。