PHP计算时间,统计图表


前言
因为公司有多个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值