背景:签到情况需求,展示7天的信息,如果连续签到不足7天,则从第一次连签开始(没有连则从今天开始)往后算7个,如果超出超出7天则今天放在最后一个位置往前算7个。
思路:先取前一天的mark,这个字段是标记连续签到天数的,然后大部分值都是推算的(在签到接口逻辑稳定状态下),小部分是数据库取值比如今天的积分获得。具体看代码(虽然看了也可能看不懂)
//签到情况
public function signInStatus($uid){
//取到昨天的签到状态
$begin = strtotime(date('Y-m-d',strtotime('-1 day')));
$end = strtotime(date('Y-m-d'));
$data = $this->model('activity/Model_activity')->signInStatus($uid,$begin,$end);
$mark = empty($data) ? 0 : $data['mark'];
//循环赋值返回数组的7天数据,i记录比较数据的轮次,j记录赋值数组和整体轮次,mark_date用于计算日期
$i = $mark>5 ? $mark-6 : 0;
$j = 0;
$mark_date = $mark>5 ? 6 : $mark;
while($j < 7){
//计算日期
$result[$j]['date'] = date('Y-m-d',strtotime(($j-$mark_date).' day'));
//计算获得的积分
if($i > $mark){
$result[$j]['points'] = 0;
}else if($i == $mark){
$getTimes = $this->model('activity/Model_activity')->getToday();
$today = $this->model('activity/Model_activity')->signInStatus($uid,$getTimes['begin'],$getTimes['end']);
$result[$j]['points'] = empty($today) ? 0 : $today['points'];
} else {
if($i == 0){
$result[$j]['points'] = 10;
}else if($i > 2){
$result[$j]['points'] = 50;
}else {
$result[$j]['points'] = 20;
}
}
//判断今天明天其他天(1为今天,2为明天,0为其他)
if($i == $mark){
$result[$j]['istoday'] = 1;
}else if($i == $mark + 1){
$result[$j]['istoday'] = 2;
}else {
$result[$j]['istoday'] = 0;
}
if($mark>6 && $j == 6){
$result[$j]['istoday'] = 1;
}
$i++;
$j++;
}
return $result;
}