生成可能单击的复选框的所有组合以添加值

时间:2016-01-16 12:25:07

标签: php combinations

我必须生成四个复选框的所有可能组合,其中顺序无关紧要。 订单无关紧要的原因是我将添加与这些复选框相关的值。

类别数组是:['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)

我错过了什么?我的想法出了什么问题?

1 个答案:

答案 0 :(得分:0)

感谢@dr_debug的评论,我找到了正确的用语:&#39; powerset&#39;。

通过这个术语,我发现了以下帖子:Power set elements of a certain length

这给了我以下功能:

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;
}

使用这些功能,您可以生成一个包含所有可能组合的数组!