<?php
/**
* 模仿error_reporting()的特殊结构,来实现复选框验证。
* 1 E_ERROR 2 E_WARNING 4 E_PARSE 8 E_NOTICE 这是error_repoting()常量的取值,当然还有许多,就不一一列出,但都统一遵循一个规律。
* 1 2 4 8... 是一个很特殊的数字序列,在二进制下,这些数字完全没有重叠,可以有多种组合,一般用在 checkbox多选的情况下。
* 例如:个人爱好:吃饭【1】 睡觉【2】 游戏【3】 音乐【4】
* 如果选择前两个,1+2 = 3,前三个,1+2+4 = 7,我们在存储选中状态的时候,只需要存一个和值就OK,而不需存储每个爱好的选择状态。
* 在以后使用的时候,只需要checkmask()验证,即可还原状态。
* 具体看下面实列:
*/
if(empty($_POST['mask'])) {
$arr = array('吃饭','睡觉','游戏','音乐'); //note 需要生成的选项数组
checkbox($arr);
} else {
$sum = setmask($love); //note $sum可以存储到数据库或文件中,这里仅仅为了测试,未做保存。
//验证数组,如果有更多,此处索引值一定要遵循二进制的规律。值为2的(n-1)次幂
$arr = array('1' => '吃饭', '2' => '睡觉', '4' => '游戏', '8' => '音乐');
echo'你的爱好:<br /><hr>';
foreach ($arr as $k => $v) {
if(checkmask($sum,$k)){
echo $v.'<br />';
}
}
}
/**
* 生成复选框
* author:dain_sun
* @param array checkbox值的数组
*/
function checkbox($arr) {
echo '<form name="frm" method="post" >';
$i = 1;
foreach($arr as $value) {
echo '<input type="checkbox" name="love[]" value="'.$i.'">'.$value.' <br />';
$i++;
}
echo '<input type="submit" name="mask" value="提交">';
echo '</form>';
}
/**
* 获取选中的状态
* author:dain_sun
* @param array checkbox值的数组
* @return int 选中状态,二进制的和值
*/
function setmask($arr) {
if (empty($arr)) return 0;
$sum = 0;
foreach($arr as $key => $val) {
$sum += empty($val) ? 0 :(1 << ($val - 1));
}
return $sum;
}
/**
* 还原选中状态
* author:dain_sun
* @param int $sum 保存状态的掩码和值
* @param int $mask 掩码值(1,2,4,8......)//note 此处掩码值既为验证数组的key值
* @return bloon
*/
function checkmask($sum, $mask) {
$sum = intval($sum);
$mask = intval($mask);
return ($mask != 0 && (($sum & $mask) == $mask));
}
?>
|