找出哪些唯一数字相加以产生结果数

最后发布: 2014-01-08 22:40:07


问题

在我的网站上,我有多个复选框字段,其中每个输入的值都是前一个的两倍,如下所示:

<form name=test>
<input type='checkbox' name='groupe' value = '1'>
<input type='checkbox' name='groupe' value = '2'>
<input type='checkbox' name='groupe' value = '4'>
<input type='checkbox' name='groupe' value = '8'>
<input type='checkbox' name='groupe' value = '16'>
etc...
</form>

我存储了(由用户)选择的字段结果,将所有选定的值相加。

假设用户选择了4和1.在这种情况下,我插入字段值的总和,即5.在此阶段,插入后,我的SQL表是:

test
 5

我需要检索所选的值以创建此结果编号5。

这样做的信息是: - 31(最大结果,即每个字段1 + 2 + 4 + 8 + 16的总和) - 使用2 + 2 + 1不可能得到5的结果值,因为输入不能两次选择;

我做了很多寻求解决这个问题,但我找不到任何有用的东西。 我如何在SQL或PHP中执行此操作?

php mysql math
回答

我不确定存储总和然后恢复单个值的重点是什么 - 为什么不存储单独的值?

也就是说,如果必须,算法非常简单:

<?php
    print_r(get_parts($argv[1]));

    function get_parts($number) {
        $res = array();
        for ($pow = 1; $pow <= 16; $pow <<= 1)
        {
           if ($pow & $number) {
               array_push($res, $pow);
           }
        }
        return $res;
    }
?>

此函数将接受一个数字并返回组件数组:

$ php test.php 5
Array
(
    [0] => 1
    [1] => 4
)
$ php test.php 31
Array
(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 8
    [4] => 16
)


回答

如果以二进制分解最终数字,因为它是2的幂的总和,每个位将对应一个复选框。

您可以使用然后按位运算符来检查这些位是否已设置。

http://php.net/manual/en/language.operators.bitwise.php

示例:

if ($groupe & 4) {
    //if bit 000100 was set
}


回答

我不确定这是否是您正在寻找的内容,但基本上,您在PHP中读取输入表单元素的状态的方式是查看$_POST特殊全局变量。

理想情况下,每个复选框都有一个唯一的名称。 这样你就可以确定你正在阅读哪个复选框。 如果您有多个具有相同名称的元素,它们将作为数组传递,很可能按照它们在页面上呈现的顺序传递。

因此,要读取复选框的值,您可以使用:

$checkboxes = $_POST['groupe'];

$finalValue = 0;

if(isset($checkboxes))                   // make sure you are getting something back
{                 
  if (is_array($checkboxes))             // make sure you are getting back an array
  {                                      //   since you have multiple elements named groupe         
     foreach($checkboxes as $value) {
         $finalValue += $value;
     }
  }
}