//以下内容全部原创 , 主要用户获取每日签到记录的最大连续签到天数 和 需要补签的日期(如果不需要补签 把默认补签次数改为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);
}