前言
因为公司有多个APP,需求计算出每个APP的安装量,在图表中显示出来
首先查出数据,这里借用下ThinkPHP5.0的语法
$data = db("table") -> select();
$start = current($data)["add_time"];//需要查询的开始时间
$end = end($data)["add_time"];//需要查询的结束时间
$difference = ($start-$end)/86400;//计算天数
//如果是0天或者不是整数,为浮点数就加一
if($difference == 0 || !is_int($difference)){
$difference = $difference+1;
}
//注意你的时间如果是时间戳,便转为Y-m-d的格式,这里区分年,月,日函数
$androidNum = 0;//计算android下载总量
$iosNum = 0;//计算ios下载总量
foreach ($data as $key => &$value) {
$value["add_time"] = date("Y-m-d", $value["add_time"]);//我这里是时间戳,转为Y-m-d格式
if($value["system"] == "android"){
$androidNum++;
}
if($value["system"] == "IOS"){
$iosNum++;
}
}
$info = yearMonthDay($data,$difference);//转换函数,第一个参数为数据,第二个参数为开始时间与结束时间相差天数
下面的便是函数了
function yearMonthDay($data,$difference){
//判断数据是否正确
if(!is_array($data) || empty($difference)) {
return json(["status" => "1", "msg" => "请传入正确的参数", "data" => ""]);
}
//设置一个空数组$info存储数据
$info = array();
//遍历$data
foreach($data as $key => $value){
//判断$difference为多少天,并取出时间值
//小于十天就以天为单位(这里查询十条数据,所以就以月、日*10)
if($difference<=10){
$current = $data[$key]["add_time"];
}elseif($difference>10 && $difference<=300){
$current = substr($data[$key]["add_time"],0, 7);//按月份计算,截取2015-10-01的前7位,也就是年月相同
}elseif($difference>300){
$current = $current = substr($data[$key]["add_time"],0, 4);//按年份计算
}else{
$current = "";
}
//再次进行循环
foreach($data as $k => $v){
//取出这层循环的时间值
if($difference>10 && $difference<=300){
$next = substr($data[$k]["add_time"],0, 7);
}elseif($difference>300){
$next = substr($data[$k]["add_time"],0, 4);
}elseif($difference<=10){
$next = $data[$k]["add_time"];
}else{
$next = "";
}
//拿出外层循环出的一条数据和内层循环的所有数据进行比较
if($current == $next){
//如果相同,就放到一个数组中去
$info[$key][] = $v;
unset($data[$k]);
}else{
//否则跳出循环
//因为最后一条数据,如果都不相同的话,会直接跳出循环,所以我们判断如果只有一条数据,就存下它
if(count($data) == 1){
$info[][] = $v;
}
break;
}
}
}
//$info是把所有数据按照年、月、日重新排序了一下,接下来我们统计下载量
//$data现在已经用不到了,所以我初始化一下他,就相当于重新定义一个数组;
$data = array();
//循环新数组$info
foreach($info as $key => $value){
//因为上边只是排序了数组,并没有改变数组,所以我们还要判断一下
if($difference>10 && $difference<=300){
$data[$key]["year"] = substr(current($value)["add_time"], 0, 7);
}elseif($difference>300){
$data[$key]["year"] = substr(current($value)["add_time"], 0, 4);
}else{
$data[$key]["year"] = current($value)["add_time"];
}
//计算出每个时间段的总数量
$data[$key]["value"] = count($value);
//计算android与ios每个时间段的下载数量
foreach ($value as $v){
if($v["system"] == "android"){
$android[] = $v;
}
if($v["system"] == "IOS"){
$IOS[] = $v;
}
}
$data[$key]["android"] = count($android);
$data[$key]["ios"] = count($IOS);
}
return $data;
}
返回数据例子:
array (size=3)
0 =>
array (size=4)
'year' => string '2019-10' (length=7)
'value' => int 1
'android' => int 0
'ios' => int 1
1 =>
array (size=4)
'year' => string '2018-07' (length=7)
'value' => int 1
'android' => int 0
'ios' => int 1
2 =>
array (size=4)
'year' => string '2018-06' (length=7)
'value' => int 1
'android' => int 0
'ios' => int 1