二进制字符串存储多个情况,数据输入比较与输出

广告位招租
扫码页面底部二维码联系

在《数据库中用一个值来保存多种情况:二进制和【作者:唐霜】【未经授权禁止转载】按位异或》和《用二进制字符串作为索引,构建时间段》两篇文章中,我提供了用二进制字符串存储未经授权,禁止复制转载。【本文首发于唐霜的博客】多种情况,并且把存储起来的字符串读取出来【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】构建需要的情况集合的方法,下面简单回顾一原创内容,盗版必究。本文作者:唐霜,转载请注明出处。下。

本文作者:唐霜,转载请注明出处。【本文受版权保护】

1.二进制字符串按位表示情况

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【关注微信公众号:wwwtangshua【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】ngnet】

011001000000这十二个位置,被【原创内容,转载请注明出处】【未经授权禁止转载】标注为1的位置,表示这个位置对应的时间段未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net被占用,也就是9:00~11:00,13【原创不易,请尊重版权】【原创不易,请尊重版权】:00~14:00被占用了。

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

2.从数据库中读取的

【访问 www.tangshuang.n本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】et 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。转载请注明出处:www.tangshua【原创不易,请尊重版权】【转载请注明来源】ng.net

现在要将011001000000还原为9【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】:00~11:00,13:00~14:0【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。0,用到如下代码:

转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】ng.net本文作者:唐霜,转载请注明出处。
function bin_string_to_hours($string,$hours = array('08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00')) { 
  $length = count($hours) - 1; // 因为$hours是按时间点设置的,所以个数比时间段要多1 
  if(!preg_match('/^[0|1]{'.$length.'}$/',$string)) return false; // 检查$string格式,必须是12位仅含01的字符串

  $result = array(); 
  $index_start = 0; // 用来记录连续的1最前的索引 
  $index_end = 0; // 用来记录连续的1最末的索引 
  $count = 0; // 用来记录有多少个连续的1 
  for($i = 0; $i <= 12; $i ++) { 
    if($i < 12 && $string[$i] == '1') { // string最大索引为11,所以这里必须<12 
      if($count == 0) $index_start = $i; 
      $index_end = $i + 1; 
      $count ++; 
    } 
    else { 
      if($count > 0 && $index_end - $index_start == $count) { // count必须>0的情况下,在能进行字符串组合,为0就没有意义了 
        $result[] = $hours[$index_start].'~'.$hours[$index_end]; 
      }
      $count = 0; 
    } 
  }

  return implode(',',$result);
}

通过上面这个函数,我们可以将字符串001【原创不易,请尊重版权】【原创内容,转载请注明出处】011010010转换为时间段10:00著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】~11:00,12:00~14:00,1原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。5:00~16:00,18:00~19:本文作者:唐霜,转载请注明出处。原创内容,盗版必究。00。

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

3.在用户提交数据过来时,检查对应的时间【本文受版权保护】【本文首发于唐霜的博客】段是否被占用

【作者:唐霜】【本文首发于唐霜的博客】

首先,我们需要一个数据表,来存储一个对象【未经授权禁止转载】【本文首发于唐霜的博客】所有时间段对应的被租用情况,这个数据表一本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】般包含以下一些字段:

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。
+---------------------------------------------------+
| id | object_id  | date       | hours              |
+---------------------------------------------------+
| 1  | 3          | 2015-08-21 | 010010110100       |
| 2  | 5          | 2015-08-21 | 000111001011       |
| 3  | 3          | 2015-09-03 | 111100011110       |
+---------------------------------------------------+

上面这张表简单记录了3和5这两个对象在不【版权所有,侵权必究】【原创不易,请尊重版权】同日期被租用的情况,但是对于用户而言是不【转载请注明来源】【版权所有】唐霜 www.tangshuang.net清楚的,在界面展示中,我们可以使用2中的【转载请注明来源】【关注微信公众号:wwwtangshuangnet】方法,把对应日期的小时时段转换为11:0原创内容,盗版必究。未经授权,禁止复制转载。0~13:00这样的时段。但是,还有一种转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net情况,就是用户在前台提交数据的时候,虽然【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】我们可以通过一定的方法,让用户不能选择某原创内容,盗版必究。【原创不易,请尊重版权】些时段,但是实际提交数据时,我们仍然需要【未经授权禁止转载】【作者:唐霜】再服务端对数据进行检查。那么怎么检查呢?

【访问 www.tangshuang.n【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】

用户首先选择了对象,日期,然后选择了几个【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。时间段,提交,提交的数据也是这样的二进制未经授权,禁止复制转载。未经授权,禁止复制转载。字符串。因此,我们首先要从数据库中,选出【转载请注明来源】转载请注明出处:www.tangshuang.net对应日期的时间被占用情况:

【关注微信公众号:wwwtangshua【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。ngnet】【本文受版权保护】
SELECT hours FROM table WHERE object_id=3 AND date='2015-09-03';

在php中,我们将得到的结果存放在变量$【转载请注明来源】原创内容,盗版必究。exists_hours中进行运算:

【作者:唐霜】【访问 www.tangshuang.n转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】et 获取更多精彩内容】
// 首先,提交的时间段必须是连续的,不连续的不予提交
$pos = strpos($_POST['hours']);
$rpos = strrpos($_POST['hours']);
$check_str = substr($_POST['hours'],$pos,$rpos - $pos + 1);
if(strpos($check_str,'01') !== false) {
  exit('提交的时段不是连续的。');
}
// 进行是否被占用检查
$exists_hours = $exists_hours ? bindec($exists_hours) : 0; // 将已经存在的二进制字符串转换为十进制数值
$request_hours = bindec($_POST['hours']); // 把提交过来的时段二进制字符串转换为十进制数值
if($exists_hours) {
  if(($exists_hours ^ $request_hours) != ($exists_hours + $request_hours)) { // 如果发现提交的时间段中,有时间段是不能使用的,那么要告诉用户哪些时间段有问题
    $not_available_hours = (($exists_hours + $request_hours) - ($exists_hours ^ $request_hours)) / 2; // 通过计算找出不能被预订的时间段
    $not_available_hours = str_pad(decbin($not_available_hours),12,"0",STR_PAD_LEFT); // 通过str_pad,将字符串补全为12位
    $not_available_hours = bin_string_to_hours($not_available_hours); // 利用2中的函数,将二进制字符串转换为我们可以看懂的时间段信息
    exit("$not_available_hours 已被预订。");
  }
}

// 插入数据库的数据准备
$save_hours = str_pad(decbin($exists_hours + $request_hours),12,"0",STR_PAD_LEFT); // 新的要存储到table中的值,实际上就是原有的值加上现在的值

通过上面这个运算,我们可以方便的对时段进【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net行判断,实现我们对数据库的更新。

【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】ang.net【关注微信公众号:wwwtangshua【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.netngnet】

2015-08-30 6116

为价值买单,打赏一杯咖啡

本文价值61.16RMB