接上一篇文章的簽到那個統計有一個算出連續簽到就要去日誌表獲取一段時間內的數據,
例如 如下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);