<code><?php |
$money = 10; # 连续签到递增金额 |
$today = date('md', strtotime('20200811 000000')); # 今天的时间, 默认使用date('md');即可 |
$sign_data = [ |
'签到礼包1', |
'签到礼包2', |
'签到礼包3', |
'签到礼包4', |
'签到礼包5', |
'签到礼包6', |
'签到礼包7' |
]; # 签到奖励 |
|
$user_sign = getUserSign(); # 获取用户签到数据 |
$sign_time = getSignTime(); # 本周所有可签到时间 |
|
$sign_times = []; # 初始化 所有已签到时间 |
$sign_days = []; # 初始化 所有连签天数 |
|
foreach ($user_sign as $line) $sign_times[] = trim($line['time']); # 所有已签到时间 |
foreach ($user_sign as $line) $sign_days[] = $line['num']; # 所有连签天数 |
|
# 距今为止最近的签到时间 |
$last_sign = 0; |
# 最后一次签到时的连续签到天数 |
$last_sign_days = 0; |
|
# 遍历可签到时间 |
foreach ($sign_time as $key => $date) { |
# 搜索时间 判断用户是否在当天签到 |
$k = array_search($date, $sign_times); |
if ($k !== false) { |
# 用户已签到 |
$jiangli .= '[' . $date . ']' . '积分奖励: ' . $sign_days[$k] * $money . ", 签到奖励: " . $sign_data[$key] . PHP_EOL; # 输出数据变量 |
$last_sign = $date; # 重置最后一次签到为当前时间 |
$last_sign_days = $sign_days[$k]; # 重置最后连续签到天数 |
} else { |
# 如果是未来,还未签到,预测每日签到可获得奖励 |
if ($date >= $today) { |
# 计算距离上次签到过了多少天 |
$days = (strtotime(date('Y') . $date . ' 000000') - strtotime(date('Y') . $last_sign . ' 000000')) / 86400; |
|
# 根据天数+1 获得下次签到时 是第几次连续签到 |
$get_money = ($last_sign_days + $days) * $money; # 签到天数*递增数额 = 奖励积分 |
|
# 如果昨日未签到 或 未签到过 |
if ($last_sign === 0) { |
$get_money = $money; # 初始化奖励积分 |
$last_sign = $date; # 重置最后签到时间为当前时间 |
$last_sign_days++; # 连续签到天数自增,预测未来每天都签到的情况下,共可连续签到多少天 |
} |
# 输出变量数据 |
$jiangli .= '[' . $date . ']' . '签到可获得积分:' . $get_money . ', 可获得礼包:' . $sign_data[$key] . PHP_EOL; |
} else { |
# 未签到 |
$jiangli .= '[' . $date . ']' . '未签到,无奖励' . PHP_EOL; |
$last_sign_days = 0; # 重置连续签到天数 |
$last_sign = 0; # 重置签到时间 |
} |
} |
} |
|
|
print_r($jiangli); |
|
|
|
# 获取可签到时间 |
function getSignTime($format = 'md') |
{ |
$weeks = [1, 2, 3, 4, 5, 6, 7]; |
foreach ($weeks as $k => $v) { |
$p = $v - date('w'); |
$p = $p >= 0 ? '+' . $p : $p; |
$p .= ' day'; |
$result[$k] = date($format, strtotime($p)); |
} |
return $result; |
} |
|
|
|
|
# 获取用户签到数据 |
# 格式 |
# [ |
# ['num'=>1, 'time'=>0810], |
# ['num'=>2, 'time'=>0811], |
# ... |
# ] |
# |
# |
# |
function getUserSign() |
{ |
|
$user_sign_str = <<<User_sign |
1|0810 |
2|0811 |
User_sign; |
|
foreach (explode("\r\n", $user_sign_str) as $line) { |
$line_arr = explode('|', $line); |
$temp[] = ['num' => $line_arr[0], 'time' => $line_arr[1]]; |
} |
return $temp; |
} |
</code> |