php设计一个连续签到的算法 断签就从0天开始

1,首先声明下背景 :
在开发活动中我们常有遇到签到的类型活动,而签到类活动就会包含了连续签到多少天给什么奖励,断签了1-n天就从新计算的问题,今天就来解决下。

2,数据标设计
(1) 用户每天签到一次就仅仅会产生一条数据,其中主要的字段 uid,add_time,剩下字段依照自己所需添加。
(2)在查询时order by add_time desc
(3)因为要分成两种情况考虑,今日已签到,今日未签到。
(4)现在插入代码

$today_reward = 'order by add_time desc '//这里写你的查询语句。
 $day = 0;//截止目前道签到天数
 $today = DateUtil::getToday();//今日的时间戳
if ($today_reward) {
                $to_date = DateUtil::getToday();//今日凌晨时间戳
                $ye_date = DateUtil::getYesterday();//昨日凌晨时间戳
                foreach ($today_reward as $key=>$item) {
                    if ($item->add_time >= $to_date) {//如果属于今天签到
                        $day++;
                        if (strtotime(date('Y-m-d',$item->add_time)) == $today) {
                            $return_list['status'] = 1;//标示今签到了
                        }
                        $to_date-=86400;
                    }elseif ($item->add_time >= $ye_date) {//如果属于今天未签到
                        $day++;
                        $ye_date-=86400;
                    }
                }
                $return_list[$user_id]['day'] = $day;
            }
  到这里解释下;每天的时间差86400 正好错开了时间点,每天都会对应,只要不对应就算断签。
 
 如果指定某一天有奖励。就对他们之间关系算出天数取余
 if ($record_array[$user_id]['day'] >= 8) {
                if (($record_array[$user_id]['day']-2)%7 == 0) {                
                    //签到奖励
                } elseif (($record_array[$user_id]['day']-6)%7 == 0) {
                  //签到奖励
                } else {
                  //签到奖励
                }
            }

php设计一个连续签到的算法 断签就从0天开始_第1张图片

你可能感兴趣的:(总结)