我必须生成四个复选框的所有可能组合,其中顺序无关紧要。顺序无关紧要的原因是因为我会将连接到这些复选框的值相加。
类别数组为:['kw1','kw2','kw3','kw4']
这意味着kw1+kw2 = kw2+kw1
.因此,这必须被视为一种组合。
我已经走得很远了,但我没能理解它。
首先,用户可以单击 1 到 4 个复选框,不需要固定数量的复选框。这可以转换为 for 循环:
for($i=1;$i<=4;$i++){
}
当只能单击 1 个复选框时,有 4 个可能的选项。选中 4 个复选框时,只有 1 个选项可用。选中第一个复选框后,只剩下 3 个选项。选中第二个复选框后,只有 2 个选项可用。你得到钻头。
我把它翻译成:
for($i=1;$i<=4;$i++){
$j = 5 - $i;
$reverse_j = 0;
$categories = array('kw1','kw2','kw3','kw4');
for($j;$j>0;$j--){
$reverse_j++;
$counter = 0;
foreach($categories as $category){
$counter++;
$tmp = $categories;
if($counter <= $i){
$result[$i][$reverse_j][] = $tmp[0];
unset($tmp[0]);
$tmp = array_values($tmp);
}
}
unset($categories[0]);
$categories = array_values($categories);
}
}
以上是尝试生成组合的许多失败尝试之一。我已经写出了所有的组合,因为它并不难,但我真的很想为它创建代码。
可能的组合应该是:
1 click = (1), (2), (3), (4)
2 clicks = (1-2), (1-3), (1-4), (2-3) ,(2-4), (3-4)
3 clicks = (1-2-3), (1-2-4), (1-3-4), (2-3-4)
4 clicks = (1-2-3-4)
我错过了什么?我的想法哪里出了问题?
多亏了@dr_debug的评论,我找到了我正在寻找的正确术语:"powerset"。
有了这个术语,我找到了以下帖子:一定长度的功率集元素
这给了我以下功能:
function subsets_n($arr, $k)
{
if (count($arr) < $k) return array();
if (count($arr) == $k) return array(0 => $arr);
$x = array_pop($arr);
if (is_null($x)) return array();
return array_merge(subsets_n($arr, $k),
merge_into_each($x, subsets_n($arr, $k-1)) );
}
function merge_into_each($x, $arr)
{
foreach ($arr as &$a) array_push($a, $x);
return $arr;
}
使用这些函数,您可以生成包含所有可能组合的数组!