【发布时间】:2014-06-07 11:49:49
【问题描述】:
我有一个如下所示的数组:
$i[0] = ['a', 'b', 'c'];
$i[1] = ['d', 'e'];
$i[2] = ['a', 'b', 'c'];
$i[3] = ['d', 'e'];
$i[4] = ['f', 'g', 'h'];
我想获得这个数组的所有可能的排列或组合,但不要从两个或多个子数组中两次使用相同的值。例如,结果a d b e f 是可能的,但不是a d a d f。
我已经尝试过基本的置换算法,但我不知道如何修改它来做我想做的事情。
这是我目前所拥有的:
function array_permutation(array $a){
$count = array_map('count', $a);
$finalSize = 1;
foreach ($count as $val) {
$finalSize *= $val;
}
$output = [];
for ($i = 0; $i < $finalSize; $i++) {
$output[$i] = [];
for ($c = 0; $c < count($a); $c++) {
$index = ($i + $finalSize) % $count[$c];
array_push($output[$i], $a[$c][$index]);
}
}
return $output;
}
【问题讨论】:
-
$i[0],$i[1] 每个又是一个数组,对吧?
-
是的,
$i的子数组。 -
你有没有检查过重复的组合总数是多少?
-
重复值是 108。
-
最简单的方法是计算笛卡尔积并删除具有重复项的条目。查找
array_cartesian。
标签: php algorithm combinations permutation mutual-exclusion