PHP中从MySQL查询数据转换为Highcharts格式求助
解决PHP查询MySQL生成Highcharts兼容数据的问题
没问题,我来帮你把查询结果转换成Highcharts需要的格式!你当前的代码把数据拆成了两个独立的字符串,没法直接配对成需要的点数据,咱们直接在循环里就组装好每一组数据就行,分两种方法给你:
方法1:直接生成Date.UTC()格式的字符串
这种方法完全匹配你想要的输出格式,注意要处理Highcharts月份从0开始的坑(比如1月对应0,12月对应11),同时修复你SQL里的语法错误(多了个多余的单引号):
// 初始化数组存储每个数据点 $dataPoints = []; // 修复SQL里的单引号错误 $sql = "SELECT DATEDIFF(due_date, start_date) as diff, due_date from project WHERE project_id = 77"; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { // 拆分日期为年、月、日 list($year, $month, $day) = explode('-', $row["due_date"]); // Highcharts月份是0-based,所以减1 $adjustedMonth = (int)$month - 1; $diffValue = (int)$row["diff"]; // 组装单个数据点的字符串 $dataPoints[] = "[Date.UTC($year, $adjustedMonth, $day), $diffValue]"; } } // 合并成完整的Highcharts数据格式 $highchartsData = "[" . implode(', ', $dataPoints) . "]";
运行后$highchartsData的输出就是你要的格式:
[Date.UTC(2018, 0, 26), 2], [Date.UTC(2018, 0, 26), 2], [Date.UTC(2018, 0, 27), 3], ...
直接在Highcharts配置里用就行:
series: [{ data: <?php echo $highchartsData; ?> }]
方法2:生成JSON格式的时间戳数组(更推荐)
这种方法更规范,避免字符串拼接可能出现的错误,Highcharts也能完美识别毫秒级时间戳:
$dataPoints = []; $sql = "SELECT DATEDIFF(due_date, start_date) as diff, due_date from project WHERE project_id = 77"; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { // PHP时间戳是秒级,转成Highcharts需要的毫秒级 $timestamp = strtotime($row["due_date"]) * 1000; $diffValue = (int)$row["diff"]; // 存为PHP数组 $dataPoints[] = [$timestamp, $diffValue]; } } // 转成标准JSON格式 $highchartsData = json_encode($dataPoints);
输出的JSON格式类似:
[[1516924800000,2],[1516924800000,2],[1516924800000,3],...]
前端使用时直接输出即可,Highcharts会自动解析时间戳:
series: [{ data: <?php echo $highchartsData; ?> }]
关键注意事项
- 你的原始SQL语句里
project_id =77'多了一个单引号,这会导致语法错误,一定要去掉! - 如果用
Date.UTC()的方式,必须把月份减1,否则1月会被识别为2月,这是Highcharts最容易踩的坑之一。 - 用时间戳的话,确保MySQL返回的日期格式是
YYYY-MM-DD,strtotime()能正确解析这种格式。
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

