Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5096557
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2010-03-26 11:00:42

<?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'你的爱好:


';
foreach ($arr as $k => $v) {
if(checkmask($sum,$k)){
echo $v.'
'
;
}
}
}

/**
* 生成复选框
* author:dain_sun
* @param array checkbox值的数组
*/

function checkbox($arr) {

echo '
';
$i = 1;
foreach($arr as $value) {
echo '.$i.'">'.$value.'
'
;
$i++;
}
echo '';
echo ''
;
}

/**
* 获取选中的状态
* 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));
}

?>


阅读(1220) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~