如何计算您已经连续签到几天

在简单的签到记录表中,如何快速计算您已经连续签到几天?

假如你已经拿到了所有的签到记录日期类似于

<?php
$list = [
    '2022-08-21', 
    '2022-08-20',
    '2022-08-19',
    '2022-08-12'
];

该如何判断呢?

写个函数

<?php
function calc_num(array $list = []) {
    if (empty($list)) {
        return 0;
    }
    $num = 1;
    $today = date('Y-m-d');
    $flag = 0;
    if (!in_array($today, $list)) {
        array_unshift($list, $today);
        $flag = -1;
    }
    $count = count($list);
    for ($i = 1; $i < $count; $i++) { 
        if (strtotime($list[$i - 1]) - strtotime($list[$i]) != 86400) {
            break;
        }
        $num++;
    }
    return $num + $flag;
}

传入签到的记录日期数组,得到计算结果您已经连续签到xx天.

这里需要明确一点,如果昨天今天都没有签到 则设定为0.

昨天没签到今天签到了,就是连续1天.

昨天签到了今天没签到,也是连续1天.

昨天签到了今天也签到,就是连续2天.

前天签到了昨天签到了,今天没签到,就是连续2天.

前天签到了昨天签到了,今天也签到,就是连续3天.

所以应该把今天也算在内.最后看今天有没有签到如果没有则减1

或者采用另外一种算法

先判断昨天和今天是不是签到了, 如果都没有则立即返回0

<?php
function calc_num2(array $list = []) {
    if (empty($list)) {
        return 0;
    }
    $diff = strtotime(date('Y-m-d')) - strtotime($list[0]);
    if ($diff != 0 && $diff != 86400) {
        return 0;//昨天和今天都没签到 则返回0
    }
    $num = 1;
    $count = count($list);
    for ($i = 1; $i < $count; $i++) { 
        if (strtotime($list[$i - 1]) - strtotime($list[$i]) != 86400) {
            break;
        }
        $num++;
    }
    return $num;
}

这个写法稍微好理解点后面就是计算连续的次数自增就行

posted @ 2022-08-22 10:43  李照耀  阅读(381)  评论(0编辑  收藏  举报