php計算日期數組中連續的天數

接上一篇文章的簽到那個統計有一個算出連續簽到就要去日誌表獲取一段時間內的數據,

 

例如 如下json數組

[
{"oneday_time":1588435200,"oneday":"2020-05-03","week":"0","weektext":"週日","morning":1588455858,"morninghour":"05:44"},
{"oneday_time":1588521600,"oneday":"2020-05-04","week":"1","weektext":"週一","morning":1588556679,"morninghour":"09:44"},
{"oneday_time":1588608000,"oneday":"2020-05-05","week":"2","weektext":"週二","morning":1588648262,"morninghour":"11:11"},
{"oneday_time":1588694400,"oneday":"2020-05-06","week":"3","weektext":"週三","morning":1588716032,"morninghour":"06:00"},
{"oneday_time":1588780800,"oneday":"2020-05-07","week":"4","weektext":"週四","morning":1588811814,"morninghour":"08:36"},
{"oneday_time":1588867200,"oneday":"2020-05-08","week":"5","weektext":"週五","morning":1588892085,"morninghour":"06:54"}]

怎麼算出連續的天數算法如下

$len = 0;
        $i=0;
        $max=array_reduce($resultdata['morning'],function ($a,$b) use(&$len,&$i,$count,$resultdata){
            if ($i+1 == $count){return $a;}
            else {
                if ((strtotime($b['oneday']) + 86400) == strtotime($resultdata['morning'][$i+1]['oneday'])) {
                    $len++;
                } else {
                    if ($len > $a){$a = $len;}
                    $len = 1;
                }
                if ($len > $a) {$a = $len;}
                $i++;
                return $a;
            }
        },1);

順帶還有連續早起,最早起牀,平均起牀

$morningdata = array_column($resultdata['morning'], 'morning');
$morningcolocknumber = count($morningdata);//本週早起
$countmorning = array_sum(array_values($morningdata));
$avgmoring = date('H:i',bcdiv($countmorning, $morningcolocknumber, 0));//平均起牀
$minmorning=date('H:i', min($morningdata))//最早起牀

下面再來說說上面的方法還有沒有其他方法,有的下面這張,

這裏同時告訴array_reduce怎麼獲取key的,也是通過差不多外層傳一個$i,結合array_keys來使用

$count=count($resultdata['morning']);//可替換上面的$morningcolocknumber
        $len = 0;
        $i=0;
        $max=array_reduce($resultdata['morning'],function ($a,$b) use(&$len,&$i,$count,$resultdata){
            if ($i+1 == $count){return $a;}
            else {
                if ((strtotime($b['oneday']) + 86400) == strtotime($resultdata['morning'][$i+1]['oneday'])) {
                    $len++;
                } else {
                    if ($len > $a){$a = $len;}
                    $len = 1;
                }
                if ($len > $a) {$a = $len;}
                $i++;
                return $a;
            }
        },1);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章