PHP实现签到功能 获取最大连续天数带补签功能,默认补签机会数(不需要补签的可以把补签机会设为0);

//以下内容全部原创 , 主要用户获取每日签到记录的最大连续签到天数 和 需要补签的日期(如果不需要补签 把默认补签次数改为0一样适用)
//主要目的是用于自己记录一些封装好的方法 和 分享以供大家借鉴。 希望大家能提出优化建议。
//如若转载 望加来源,谢谢。

//某段时期内的 签到记录   
$user_qiandao_info = self::getUserGiftDay($uid,  self::$hd_ename,'freegift',$reset_time);  //用于获取用户的签到记录
$user_qiandao_day = array_column($user_gifts,'addtime');//取数组中的签到日期重新组成数组
rsort($user_qiandao_day);//倒叙排列
if(empty($user_qiandao_day[0])){ return array();}  //如果从未签到 则重新开始
return self::keep_day($user_qiandao_day,$bq_num);  //调用keep_day方法 获取最大连续签到天数(传入签到记录列表 和 默认补签次数)



public static function keep_day($day_map,$bq_num = 1){  //默认1次补签机会
    $data = array();
    $buqian = array();//补签记录
    $day_map = self::day_map_init($day_map); //调用下面的方法 处理签到记录 , 签到记录日期取整
    $now_time = time();
    $today = date('Y-m-d',$now_time);
    //先查询最后一次签到距当前时间差
    $day_cha = (strtotime($today) - strtotime($day_map[0]))/86400;
    if($day_cha <= 1){
        //不需要消耗补签
    }else{
        if($day_cha > $bq_num + 1){//最大时间差天数为补签次数+1;
            //最后一次签到距今天已超过最大间隔天数 则返回原有数据
            return $data;
        }else{
            //最后一次签到距今天小于等于最大间隔天数,需要补签多少天  依次补签
            for($j = 1;$j < $day_cha;$j++){
                $bq_num--;
                $buqian[] = date('Y-m-d',$now_time-86400*$j);//需要补签的日期   当前时间的前一天
            }
        }
    }
    $keep_day = 1;  //默认当前连续1天
    $count = count($day_map);
    if($count <= 1) {  //总共签到记录小于等于1则返回
        $data['keep_day'] =  $keep_day;
        $data['buqian'] =  $buqian;
        return $data;
    }
    //有多条签到记录则继续依次处理
    for($i=0;$i<$count-1;$i++){
        $day_cha = (strtotime($day_map[$i]) - strtotime($day_map[$i+1]))/86400;
        if($day_cha <= 1){
            //连续日期 不需要消耗补签
            $keep_day++;
        }else{
            if($day_cha > $bq_num + 1){
                //两次签到已超过最大间隔天数 则连续天数到此为止
                $data['keep_day'] =  $keep_day;
                $data['buqian'] =  $buqian;
                return $data;
            }else{
                //每补签一段时间 登录次数就+1;
                $keep_day++;
                //最后一次签到距今天小于等于最大间隔天数,需要补签多天  挨个补签
                for($j = 1;$j < $day_cha;$j++){
                    $bq_num--;
                    $buqian[] = date('Y-m-d',strtotime($day_map[$i])-86400*$j);//补签 日期 ???补签昨天
                }
            }
        }
    }
    $data['keep_day'] = $keep_day;
    $data['buqian'] = $buqian;
    return $data;
}
/**
 * 签到日期 初始化 (日期取整)
 */
public function day_map_init($day_map){
    foreach($day_map as $k => $v){
        $day_map[$k] = date("Y-m-d",strtotime($v));
    }
    return array_unique($day_map);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值