在项目中做统计分析实在是想法乱入,各种x,y值都会出现,但以时间为统计单位还是比较常见,这里记录一个自己写的时间分组小函数
代码如下:
function timeArrayProcess($startTime, $endTime, $type = null) {
$format = "Y-m-d H:i:s";
if ($startTime > $endTime) {
$temp = $startTime;
$startTime = $endTime;
$endTime = $temp;
}
$timeLength = date_diff(date_create($startTime), date_create($endTime));
//echo $diff->format("%a days");
$s_stamp = strtotime($startTime);
$e_stamp = strtotime($endTime);
$time_arr = array();
if (empty($type)) {
if ($timeLength->days <= 1) {
$type = "hour";
} elseif (($timeLength->days > 1) and ( $timeLength->days <= 31)) {
$type = "day";
} elseif (($timeLength->days > 31) and ( $timeLength->days <= 92)) {
$type = "week";
} elseif (($timeLength->days > 92) and ( $timeLength->days <= 730)) {
$type = "month";
} else {
$type = "year";
}
}
switch ($type) {
case hour:
$start = date('Y-m-d H:00:00', strtotime($startTime));
$end = date('Y-m-d H:00:00', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
$ns_stamp = $s_stamp;
} else {
$i = 1;
$time_arr[0][x] = date('Y-m-d H', $s_stamp) . "时";
$time_arr[0][start] = date($format, $s_stamp);
$ns_stamp+=3599;
$time_arr[0][end] = date($format, $ns_stamp);
$ns_stamp+=1;
}
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('Y-m-d H', $ns_stamp) . "时";
$time_arr[$i][start] = date($format, $ns_stamp);
$ns_stamp+=3599;
//if ($ns_stamp < $ne_stamp) {
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
//} else {
//break;
// }
}
//$e_stamp-=1;
if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('Y-m-d H', $ne_stamp) . "时";
$time_arr[$i][start] = date($format, $ne_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
}
break;
case day:
$start = date('Y-m-d', strtotime($startTime));
$end = date('Y-m-d', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
} else {
$i = 1;
$time_arr[0][x] = date('Y-m-d', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$ns_stamp+=86399;
$time_arr[0][end] = date($format, $ns_stamp);
$ns_stamp+=1;
}//$ne_stamp = $e_stamp;
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('Y-m-d', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$ns_stamp+=86399;
if ($ns_stamp < $ne_stamp) {
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
}
}
//$e_stamp=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('Y-m-d', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
//}
break;
case week:
$start = date('Y-m-d', strtotime($startTime));
$end = date('Y-m-d', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
} else {
$i = 1;
$time_arr[0][x] = date('Y-m-d', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$w = date('N', strtotime($time_arr[0][start]));
$ns_stamp+=(8 - $w ) * 86400 - 1;
$time_arr[0][end] = date($format, $ns_stamp);
$arr = array(date('Y-m-d', strtotime($time_arr[0][start])), date('Y-m-d', strtotime($time_arr[0][end])));
$time_arr[0][x] = implode("~", $arr);
$ns_stamp+=1;
}
//$ne_stamp = $e_stamp;
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('Y-m-d', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$ns_stamp+=604799; //(7 * 86400 - 1)
if ($ns_stamp < $ne_stamp) {
$time_arr[$i][end] = date($format, $ns_stamp);
$arr = array(date('Y-m-d', strtotime($time_arr[$i][start])), date('Y-m-d', strtotime($time_arr[$i][end])));
$time_arr[$i][x] = implode("~", $arr);
$ns_stamp+=1;
$i++;
} /* else {
break;
} */
}
//$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][start] = date($format, $ns_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
$arr = array(date('Y-m-d', strtotime($time_arr[$i][start])), date('Y-m-d', strtotime($time_arr[$i][end])));
$time_arr[$i][x] = implode("~", $arr);
//}
break;
case month:
$start = date('Y-m', strtotime($startTime));
$end = date('Y-m', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
$ns_stamp = $s_stamp;
} else {
$i = 1;
$time_arr[0][x] = date('Y-m', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$num = date("t", $s_stamp);
$ns_stamp+=$num * 86400 - 1;
$time_arr[0][end] = date($format, $ns_stamp);
$ns_stamp+=1;
}
while ($ns_stamp < $ne_stamp) {//这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数
$time_arr[$i][x] = date('Y-m', $ns_stamp);
$time_arr[$i][start] = date($format, strtotime($time_arr[$i][x]));
$num = date("t", $ns_stamp);
$ns_stamp+=$num * 86400 - 1;
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
}
//$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('Y-m', $ne_stamp);
$time_arr[$i][start] = date($format, strtotime($time_arr[$i][x]));
$time_arr[$i][end] = date($format, $e_stamp);
//}
break;
case year:
$start = date('Y-01-01 00:00:00', strtotime($startTime));
$end = date('Y-01-01 00:00:00', strtotime($endTime));
$ns_stamp = strtotime($start);
$ne_stamp = strtotime($end);
if ($ns_stamp == $s_stamp) {
$i = 0;
} else {
$i = 1;
$time_arr[0][x] = date('Y', $s_stamp);
$time_arr[0][start] = date($format, $s_stamp);
$s_stamp = strtotime(date("Y-12-31 23:59:59", $s_stamp));
$time_arr[0][end] = date($format, $s_stamp);
$nu = 0;
for ($j = 01; $j <= 12; $j++) {
$stamp = strtotime(date("Y-$j", $s_stamp));
$nu += date("t", $stamp);
}
$ns_stamp+=$nu * 86400;
}//$ne_stamp = $e_stamp;
while ($ns_stamp < $ne_stamp) {
$time_arr[$i][x] = date('Y', $ns_stamp);
$time_arr[$i][start] = date($format, $ns_stamp);
$n = 0;
for ($j = 01; $j <= 12; $j++) {
$stamp = strtotime(date("Y-$j", $ns_stamp));
$n += date("t", $stamp);
}
$ns_stamp+=$n * 86400 - 1;
$time_arr[$i][end] = date($format, $ns_stamp);
$ns_stamp+=1;
$i++;
}
//$e_stamp-=1;
//if ($ne_stamp < $e_stamp) {
$time_arr[$i][x] = date('Y', $ne_stamp);
$time_arr[$i][start] = date($format, $ne_stamp);
$time_arr[$i][end] = date($format, $e_stamp);
//}
break;
default:
break;
}
//var_dump($time_arr);
return $time_arr;
}