Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找对哪些唯一数字求和以生成结果数_Php_Mysql_Math - Fatal编程技术网

Php 查找对哪些唯一数字求和以生成结果数

Php 查找对哪些唯一数字求和以生成结果数,php,mysql,math,Php,Mysql,Math,在我的网站上,我有多个复选框字段,其中每个输入的值都是前一个的两倍,如下所示: <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='che

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

<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>
我需要检索所选的值以创建第5个结果

有关信息如下: -31(最大结果,即每个字段1+2+4+8+16之和) -使用2+2+1不可能得到结果值5,因为一个输入不能选择两次


我做了很多搜索来解决这个问题,但是我找不到任何有用的东西。如何在SQL或PHP中实现这一点?

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

您可以使用逐位运算符检查这些位的设置

例如:

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

我不确定这是否是您想要的,但基本上,您在PHP中读取输入表单元素状态的方式是通过查看
$\u 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;
     }
  }
}

我不确定存储总和然后恢复单个值的意义是什么——为什么不存储单独的值呢

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

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

最好的答案,但我认为这是答案的thx,我不明白一切。。什么是$input变量?!我测试了get_parts(5),它返回了一个错误,你有具体的例子吗?@GuillaumeRoyer它实际上是
@albator抱歉,它应该是
$input
-只是我测试的一个剩余部分。刚刚更正。@albator我用完整的程序和测试运行更新了我的答案
<?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
)