PHP:没有排列的组合



这段代码给了我长度为x的n个值的每一个可能的组合,使其和为n。

function GETall_distri_pres($n_valeurs, $x_entrees, $combi_presences = array()) {
if ($n_valeurs == 1) { 
$combi_presences[] = $x_entrees;
return array($combi_presences);
}
$combinaisons = array();
// $tiroir est le nombre de chaussettes dans le tiroir suivant
for ($tiroir = 0; $tiroir <= $x_entrees; $tiroir++) {
$combinaisons = array_merge($combinaisons, GETall_distri_pres(
$n_valeurs - 1,
$x_entrees - $tiroir,
array_merge($combi_presences, array($tiroir))));
}
return $combinaisons;
}

我只需要生成唯一的分布,例如没有[2,1,0]和[1,2,1,0],只有[2,1,0]。

var_dump(GETall_stri_pres(3,3((将给出:

array (size=10)
0 => 
array (size=3)
0 => int 0
1 => int 0
2 => int 3
1 => 
array (size=3)
0 => int 0
1 => int 1
2 => int 2
2 => 
array (size=3)
0 => int 0
1 => int 2
2 => int 1
3 => 
array (size=3)
0 => int 0
1 => int 3
2 => int 0
4 => 
array (size=3)
0 => int 1
1 => int 0
2 => int 2
5 => 
array (size=3)
0 => int 1
1 => int 1
2 => int 1
6 => 
array (size=3)
0 => int 1
1 => int 2
2 => int 0
7 => 
array (size=3)
0 => int 2
1 => int 0
2 => int 1
8 => 
array (size=3)
0 => int 2
1 => int 1
2 => int 0
9 => 
array (size=3)
0 => int 3
1 => int 0
2 => int 0

你有什么想法吗?

这将是一种方法:在返回计算集之前,您可以通过创建一个新的关联数组来过滤它们,使用标准化排列作为键。这将导致排列覆盖它们自己,因此只有一个会被保留:

<?php
function GETall_distri_pres($n_valeurs, $x_entrees, $combi_presences = array()) {
if ($n_valeurs == 1) { 
$combi_presences[] = $x_entrees;
return array($combi_presences);
}
$combinaisons = array();
// $tiroir est le nombre de chaussettes dans le tiroir suivant
for ($tiroir = 0; $tiroir <= $x_entrees; $tiroir++) {
$combinaisons = array_merge($combinaisons, GETall_distri_pres(
$n_valeurs - 1,
$x_entrees - $tiroir,
array_merge($combi_presences, array($tiroir))));
}

// filter out permutations
$filteredCombinations = [];
array_walk($combinaisons, function($entry) use(&$filteredCombinations) {
arsort($entry);
$filteredCombinations[join('', $entry)] = $entry;
});
return array_values($filteredCombinations);
}
$result = GETall_distri_pres(3, 3);
print_r($result);

输出显然是:

Array
(
[0] => Array
(
[0] => 3
[1] => 0
[2] => 0
)
[1] => Array
(
[0] => 2
[1] => 1
[2] => 0
)
[2] => Array
(
[0] => 1
[1] => 1
[2] => 1
)
)

最新更新