10分钟间隔的时间轴+换个思路的foreach循环
$int_val = 1; //基础时间杠杆 $interval = 600 * $int_val; //时间间隔,600秒,10分钟 $etime = strtotime(date('Y-m-d H', time()) . ':00:00')+ 3600; $stime = strtotime(date('Y-m-d H', time()) . ':00:00'); //$etime = strtotime('2016-01-28 00:00:00'); //$stime = strtotime('2016-01-27 18:00:00'); $stime = $_REQUEST['stime'] != '0' ? strtotime($_REQUEST['stime']) : $stime; $etime = $_REQUEST['etime'] != '0' ? strtotime($_REQUEST['etime']) : $etime; $xLength = intval(($etime - $stime) / $interval) + 1; //根据时间差算出X轴刻度数量 $baseData = array_pad(array(), $xLength, 0); //默认各刻度数据 $sql_channel = "SELECT cid, channelName FROM interval_data WHERE cTime>= $stime AND cTime<= $etime GROUP BY cid"; $channels = needInfo($sql_channel, '2'); $sql = "SELECT cid,channelName,gameName,SUM(shows) AS shows,SUM(clicks) AS clicks,SUM(regs) AS regs,cTime AS cTime FROM interval_data WHERE cTime>= $stime AND cTime<= $etime GROUP BY cTime,cid ORDER BY cTime,cid DESC"; $data = needInfo($sql, '2'); $subtitle = date('Y-m-d H:i:s', $stime) . ' 至 ' . date('Y-m-d H:i:s', $etime); //副标题 $xAxis = array(); //x轴 $series_shows = array(); //访问元数据 $series_clicks = array(); //点击元数据 $series_regs = array(); //注册元数据 for ($i = 0; $i < $xLength; $i++) { $xAxis[$i] = $stime + ($interval * $i); //添加X轴日期数据 } if (count($data) > 0) { foreach ($channels as $value) { //添加展示量渠道名称数据及默认刻度数据 $series_shows[$value['cid']]['name'] = $value['channelName'] . '(' . $value['cid'] . ')'; $series_shows[$value['cid']]['data'] = $baseData; //添加点击量渠道名称数据及默认刻度数据 $series_clicks[$value['cid']]['name'] = $value['channelName'] . '(' . $value['cid'] . ')'; $series_clicks[$value['cid']]['data'] = $baseData; //添加注册量渠道名称数据及默认刻度数据 $series_regs[$value['cid']]['name'] = $value['channelName'] . '(' . $value['cid'] . ')'; $series_regs[$value['cid']]['data'] = $baseData; } $tempdata = array(); //临时存储跨阶段数据 foreach ($data as $dk => $dv) { $tempdata[$dv['cid']]['show'] = $tempdata[$dv['cid']]['show'] + intval($dv['shows']); $tempdata[$dv['cid']]['clicks'] = $tempdata[$dv['cid']]['clicks'] + intval($dv['clicks']); $tempdata[$dv['cid']]['regs'] = $tempdata[$dv['cid']]['regs'] + intval($dv['regs']); if (in_array($dv['cTime'], $xAxis)) { $xk = array_search($dv['cTime'], $xAxis); $series_shows[$dv['cid']]['data'][$xk] = $tempdata[$dv['cid']]['show']; $series_clicks[$dv['cid']]['data'][$xk] = $tempdata[$dv['cid']]['clicks']; $series_regs[$dv['cid']]['data'][$xk] = $tempdata[$dv['cid']]['regs']; unset($tempdata[$dv['cid']]); } /** * ,该部分存在以条件性bug * 条件:1,使用跨点合并数据是,及非基础阶段数据时,如:20分跨度,30分钟跨度 * 条件:2,快点存在数据,展示点不存在数据时,如:10分为跨点,存在渠道A的数据为11,20位展示点,没有渠道A的数据。 * 错误:会将跨点数据一致合并,直到展示点存在该渠道数据时合并展示 * 事例:如:10分钟跨点A渠道为11,20分展示点不存在A数据,30分存在A数据为10,40分展示点存在A数据为11,则40展示位11+10+11 * */ } } foreach ($xAxis as $xk => $xv) { $xAxis[$xk] = date('H:i', $xv); //时间格式化 } $datas = array(); $datas['subtitle'] = $subtitle; $datas['xAxis'] = array_values($xAxis); //去重并删除索引 $datas['series']['shows'] = array_values($series_shows); //访问总数据 $datas['series']['clicks'] = array_values($series_clicks); //点击总数据 $datas['series']['regs'] = array_values($series_regs); //注册总数据 echo($_GET['callback'] . '(' . json_encode($datas) . ')');