// Input array
$arr = [
'A' => '9-11',
'B' => '9-12',
'C' => '12-14',
'D' => '13-14',
'E' => '15-16',
'F' => '15-16',
'G' => '13-14',
'H' => '14-16'
];
// ranges
$start = 9;
$end = 16;
// Desired outputs:
A + C + E (9-11, 12-14, 15-16)
A + C + F (9-11, 12-14, 15-16)
A + C + H (9-11, 12-14, 14-16)
B + D + E (9-12, 13-14, 15-16)
B + G + F (9-12, 13-14, 15-16)
B + G + H (9-12, 13-14, 14-16)
所以这意味着,每个组合都必须从9开始(就像我们$start = 9
一样),并尝试到16 (即。具有每个组合中的n
元素的$end = 16
(如果可用)(此处为n = 3
)。
我在网上搜索了许多问题,并尝试了一些自己的东西。但不幸的是,他们甚至没有更接近解决方案的标题。我正在处理的问题与上面的例子不同,也很复杂。
发布于 2015-10-03 00:25:36
您需要在多次迭代中执行此操作:
n
的组合。(作为预处理步骤,您希望将9-11
更改为[9,11]
,以便以后可以轻松地检查范围,例如,对于最小值为>= $range[0]
...对于最大值为<= $range[1]
)
有所帮助
添加条件可以过滤掉不是以$start
.
$end
结尾的组合
EDIT:一个好的开始可能是:
function appendElements($elements, & $dst) {
foreach ($elements as $ele) $dst[] = $ele;
}
function buildTouples($map, $start, $end, $size, $currentSize, $touplesToExtend) {
if ($currentSize == $size) return $touplesToExtend;
if ($map === []) return [];
$allTouples = [];
foreach ($map as $key => $range) {
unset($map[$key]);
foreach ($touplesToExtend as $toupleToExtend) {
$toupleToExtend[] = $key;
$newTouples =
buildTouples($map, $start, $end, $size, $currentSize+1, [$toupleToExtend]);
appendElements($newTouples, $allTouples);
}
}
return $allTouples;
}
用作:
$map = [
'A' => [9,11],
'B' => [9,12],
'C' => [12,14],
'D' => [13,14],
'E' => [15,16],
'F' => [15,16],
'G' => [13,14],
'H' => [14,16]
];
$start = 9;
$end = 16;
$size = 3;
$touples = buildTouples($map, $start, $end, $size, 0, [[]]);
foreach ($touples as $touple) {
foreach ($touple as $val) echo $val;
echo ', ';
}
输出:
ABC、ABD、ABE、ABF、ABG、ABH、ACD、ACE、ACF、ACG、ACH、ADE、ADF、ADG、ADH、AFH、AFH、AGH、BCD、BCE、BCF、BCG、BCH、BDE、BDF、BDG、BDH、BDF、BEG、BEG、BEH、BFG、BFH、BGH、CDE、CDF、CDG、CDH、CDH、CEF、CEG、CDG、CDH、CGH、DEG、DFG、DFH、DGH、DGH、EFG、EGH、FGH、
https://stackoverflow.com/questions/32911454
复制相似问题