在我的网站上,我有多个复选框字段,其中每个输入的值都是前一个的两倍,如下所示:
<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中执行此操作?
答案 0 :(得分:2)
我不确定存储总和然后恢复单个值的重点 - 为什么不存储单独的值?
那就是说,如果必须的话,算法非常简单:
<?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
)
答案 1 :(得分:0)
如果以二进制分解最终数字,因为它是2的幂的总和,每个位将对应一个复选框。
您可以使用则按位运算符来检查这些位是否已设置。
http://php.net/manual/en/language.operators.bitwise.php
示例:
if ($groupe & 4) {
//if bit 000100 was set
}
答案 2 :(得分:0)
我不确定这是否是您正在寻找的内容,但基本上,您在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;
}
}
}