一定时间段内注册用户数量统计, Highcharts Stock展示功能原型

浏览:1693 发布日期:2016/01/30 分类:技术分享 关键字: 用户统计 Highcharts 图表 画图
工具:Thinkphp 3.x,Mysql,HighCharts Stock.js
功能:后台管理界面需要统计一定时间段内注册用户数量,然后送至前台,由HighCharts Stock绘制自每日(周/月)注册用户变化曲线.
-------------------------
毕竟是原型程序,比较简单和简陋.大概过程是这样Mysql伺候好后,用ThinkPHP写后台,然后转到前面,写好前台模板,Js脚本,css样式表等等等....(这些都是我一个人干...累!)
数据库有一个用户表,用户表内有'reg_time(timestamp)'字段,招儿就发在它身上.
//后台程序///*protected function get_statistic_user_all()
{
    $res=array();
    $user=M('Member');
    $start_date_from_db=$user->field('reg_time')->where("status=1")->order('reg_time asc')->limit(1)->find();
    $start_date= strtotime($start_date_from_db['reg_time']);
    $where['status']=1;
    $tmp=$start_date;
    $date_offset=24*60*60*30;
    $i=0;
    while( $tmp<=NOW_TIME)
    {
        $tmp=$tmp+$date_offset;
        $res[$i]=array($tmp*1000,$user->field('reg_time')->where("reg_time between FROM_UNIXTIME($start_date) and FROM_UNIXTIME($tmp)")->count());
        $i=$i+1;
    }
    return json_encode($res, JSON_NUMERIC_CHECK);
}*/
//上面方法作废,用Mysql的Group by功能直接得出来结果,然后做类似费波那奇数列的和运算即可//
更新后的算法:protected function get_statistic_user_all()
    {
        return M('Member')->field('count(1) as count,reg_time as time')->where('status=1')
            ->order('YEAR(reg_time) asc, MONTH(reg_time) asc,DAY(reg_time) asc')
            ->group('YEAR(reg_time), MONTH(reg_time),DAY(reg_time)')->select();
    }
然后再做一步转换foreach($arr as $k=>$v)
            {
                if($k==0)
                {
                    $res[$k]=array(strtotime($v['time'])*1000,$v['count']);
                }
                else
                {
                    $res[$k]=array(strtotime($v['time'])*1000,$res[$k-1][1]+$v['count']);
                }
            }

            return $res;
算法比较原始,未经过优化,就是获得网站最老会员的注册时间作为起始时间,然后各种坑爹的时间格式转换,但最终要换到UNIX时间戳的格式上.这样才能给我们$data_offset推算统计日期区间大小.bala...bala....最后要搞成Highchart要求的data格式也就是series: [{
    data: ["3", "5", "1", "6"]
}]
加粗的那个鬼样子.熟悉啊!Json字符串啊!! 嗯哼~还不太是,这是Highcharts的一个坑.其实要求的是作为坐标值的数值不能以字符串的形式存在,也就是说正确的应该是这样的data: [3, 5, 1, 6](canvas 坐标值谁给字符串干嘛?)
所有后台返回的数据也就是json_encode()要加上JSON_NUMERIC_CHECK
参数.(为什么没用ajaxReturn()? 好像不行).
后台基本上完了,读出来的数据就是 [[1201839897000,31],[1204431897000,62],...] 键是时间戳(别忘了乘以1000),值是用户数量(见Mysql语句).
前台也没什么,找HighchartStock的demo照着写一遍,把数据源换成我们后台生成的数据即可.
结果就是这样的(完美的线性?我自己推演用户注册并且自动插入的Mysql的.模拟的从2008年到2016年的3000条记录查询时间0.08s,10w条数据的话大概是个悲剧了.还是要优化一下.)

不知道各位大神对这种笨方法有什么高见.
当然改进的话,可以将上一次查询的结果保存为.JSON文件,然后下次查询的时候有新数据再追加进JSON文件.图表每次读取的是JSON文件的数据,这样速度应该会提高很多.
--------------
我人在国外,发现现在国内时间3:49的时候还有人在这个论坛逛,赞一个.
最佳答案
评论( 相关
后面还有条评论,点击查看>>