我有一个php函数,其中包含所有这些兴趣选择的数组供用户选择。我在表格中填充了这样的数据:
foreach($interests as $key=>$value){
?>
<input type="checkbox" name="targetInterests" id="targetInterests" value="<?php echo $key;?>" class="addeditplacefields">
<?php echo $value;?>
<?php
}
?>
我将复选复选框的值设为1表示为true,-1表示为false,创建1和-1的数组,并使用bitshift将这些复选复选框的值存储在我们的mysql数据库中,如下所示:
var chkStr = "";
$(":checkbox").each(function(){
chkStr += this.checked ? "1," : "-1,";
});
var chkStr = chkStr.substr(0, chkStr.length - 1);
// Turn checkbox string into an iterable array
var target = JSON.parse("[" + chkStr + "]");
x = 0;
for (i=0; i<46; i++){
var val = target[i];
if (val == 1){
x |= (1 << i);
}
return x;
按位操作对我来说是一个新概念,我很难找到一个简洁的解决方案,在用户点击保存并刷新页面或用户返回页面查看他们检查的内容后,将重新填充这些复选框。任何帮助或建议将不胜感激。
答案 0 :(得分:1)
逐位存储复选框设置的最有效方法是使用整数,其中每个复选框代表整数的1位。例如,如果设置了复选框:
checkbox 0 checked
checkbox 1 unchecked
checkbox 2 checked
这将代表5(1 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2)。在表达式的每个术语中,系数为1或0,具体取决于复选框是选中还是未选中,指数是复选框的索引。
要进行解码,即测试是否选中了复选框N,请使用&amp;&amp; (AND)运算符,如下:
isCheckBoxNChecked = I&amp;&amp; (2 ^ N)
其中I是上面计算的整数值。如果结果为1,则选中复选框,否则取消选中。例如,要解码上面示例中的复选框设置:
for checkbox 0: 5 && (2 ^ 0) =1 (so checkbox 0 was checked)
for checkbox 1: 5 && (2 ^ 1) =0 (so checkbox 1 was unchecked)
for checkbox 2: 5 && (2 ^ 2) =1 (so checkbox 2 was checked)
答案 1 :(得分:0)
建立@ mti2935的建议我意识到使用bitwise和js映射值限制为32位。我有44个元素,我试图改变,所以一旦它到达第32个元素,它将重新开始。不是一个快乐的结果!所以我用一个指数函数来解决它,就像@ mti2935建议结果如下:
var chkStr = "";
$(":checkbox").each(function(){
chkStr += this.checked ? "1," : "-1,";
});
var chkStr = chkStr.substr(0, chkStr.length - 1);
// Turn checkbox string into an iterable array
var target = JSON.parse("[" + chkStr + "]");
// Looking for values of 1 in the array
var hasCheck = $.inArray(1, target);
if (hasCheck != -1) {
// loop through the values of the above array and work the bitwise magic
y = 0;
for (i=0; i<target.length; i++){
var val = target[i];
if (val === 1){
y += Math.pow(2, i);
}
return y;
这个值被写入我们数据库中的一列,当我们想要重新访问页面并查看检查了哪些值时,或者在页面刷新后发布数据后,我们可以重新填充复选框的状态,如下所示: / p>
rawInterests = getRawInterests();
var interestArray = JSON.parse("[" + rawInterests + "]");
$.each (interestArray, function (index, val) {
if (val === 1){
$("#targetInterests[value='" + index + "']").prop('checked', true);
}
});
希望这可以帮助其他人。