将PHP/MySQL数据格式化为HighCharts的正确JSON格式
几天来,我一直在努力将一些数据组织成适当的JSON格式,以便可以将其绘制在HighCharts图形中 我的计划是执行jQuery函数来调用PHP脚本,该脚本从MySQL数据库中提取几列天气数据。我可以在JavaScript端重新浏览数据,但更希望所有的数据组织都在PHP中完成,然后在HighCharts引擎中使用一个单一的、正确的JSON结构 我在看天气数据,所以我每分钟都要采集几列数据。我从MySQL检索的数据列有:JSTimestamp(对于JavaScript是unix时间戳*1000)、avgOutdoorTemperature、avgIndoorTemperature、avgoutdoor湿度、avgindoor湿度。我已经将这些列填充到它们自己的数组中 我似乎无法理解将数据转换为以下JSON/数组格式所需的PHP逻辑:将PHP/MySQL数据格式化为HighCharts的正确JSON格式,php,mysql,json,highcharts,Php,Mysql,Json,Highcharts,几天来,我一直在努力将一些数据组织成适当的JSON格式,以便可以将其绘制在HighCharts图形中 我的计划是执行jQuery函数来调用PHP脚本,该脚本从MySQL数据库中提取几列天气数据。我可以在JavaScript端重新浏览数据,但更希望所有的数据组织都在PHP中完成,然后在HighCharts引擎中使用一个单一的、正确的JSON结构 我在看天气数据,所以我每分钟都要采集几列数据。我从MySQL检索的数据列有:JSTimestamp(对于JavaScript是unix时间戳*1000)、
[
[
[JSTimestamp1, avgOutdoorTemperature1],
[JSTimestamp2, avgOutdoorTemperature2],
[JSTimestamp3, avgOutdoorTemperature3],
[JSTimestampN, avgOutdoorTemperatureN]
],
[
[JSTimestamp1, avgIndoorTemperature1],
[JSTimestamp2, avgIndoorTemperature2],
[JSTimestamp3, avgIndoorTemperature3],
[JSTimestampN, avgIndoorTemperatureN]
],
[
[JSTimestamp1, avgOutdoorHumidity1],
[JSTimestamp2, avgOutdoorHumidity2],
[JSTimestamp3, avgOutdoorHumidity3],
[JSTimestampN, avgOutdoorHumidityN]
],
[
[JSTimestamp1, avgIndoorHumidity1],
[JSTimestamp2, avgIndoorHumidity2],
[JSTimestamp3, avgIndoorHumidity3],
[JSTimestampN, avgIndoorHumidityN]
]
]
我已经用虚拟数据填充了上面的结构,它在高图中绘制得非常漂亮。下面是一个示例演示,展示了图形的外观:
我目前的代码是:
<?php
include_once('./include/mysqldatabase.php');
include_once('./include/mysqlresultset.php');
date_default_timezone_set('America/New_York');
$MYSQL_HOST = 'ip_address';
$MYSQL_USER = 'username';
$MYSQL_PASS = 'password';
$MYSQL_NAME = 'weatherdata';
$db = MySqlDatabase::getInstance();
try {
$conn = $db->connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS, $MYSQL_NAME);
}
catch (Exception $e) {
die($e->getMessage());
}
$query = "
select
RecDate,
unix_timestamp(RecDateTime)*1000 as JSTime,
avgOutdoorTemperature,
avgIndoorTemperature,
avgOutdoorHumidity,
avgIndoorHumidity
from `rollup-minute-60`
where
RecDate > 201301010000
";
$timeArray = array();
$avgOutdoorTemperatureArray = array();
$avgIndoorTemperatureArray = array();
$combinedArray = array();
$i = 0;
$seriesNames = array('Average Outdoor Temperature','Average Indoor Temperature', 'Average Outdoor Humidity', 'Average Indoor Humidity');
foreach ($db->iterate($query) as $r) {
$jstime = $r->JSTime;
$avgOutdoorTemperature = $r->avgOutdoorTemperature;
$avgIndoorTemperature = $r->avgIndoorTemperature;
$avgOutdoorHumidity = $r->avgOutdoorHumidity;
$avgIndoorHumidity = $r->avgIndoorHumidity;
$timeArray[$i] = (float)$jstime;
$avgOutdoorTemperatureArray[$i] = (float)$avgOutdoorTemperature;
$avgIndoorTemperatureArray[$i] = (float)$avgIndoorTemperature;
$avgOutdoorHumidityArray[$i] = (float)$avgOutdoorHumidity;
$avgIndoorHumidityArray[$i] = (float)$avgIndoorHumidity;
$combinedArray[$i] = array((float)$avgOutdoorTemperature, (float)$avgIndoorTemperature, (float)$avgOutdoorHumidity, (float)$avgIndoorHumidity);
$i++;
}
echo "Combined array:<br>";
echo json_encode($combinedArray);
echo "<br><br><br>";
echo "Time array:<br>";
echo json_encode($timeArray);
echo "<br><br><br>";
$arraySize = sizeof($timeArray);
$seriesNameSize = sizeof($seriesNames);
$outputJSONArray = array();
$tempArray = array();
for ($i=0; $i<$seriesNameSize; $i++) {
for ($j=0; $j<$arraySize; $j++) {
$tempArray = array();
array_push($tempArray, $timeArray[$j], $combinedArray[$j][$i]);
echo "i=".$i.", j=".$j.", tempArray: " . json_encode($tempArray) ."<br>";
$outputJSONArray[$i] = $tempArray;
}
}
echo json_encode($outputJSONArray);
?>
对于上面的当前代码,我的输出数组只显示$outputJSONArray中的最后一个元素,而不是多维构造
有人能帮我指出正确的方向吗?我在这个网站上找到了很多好的信息来帮助我开始,但是我需要一些帮助来克服最后的障碍
谢谢大家! 查看海图常见问题解答:
第二个示例告诉您如何做到这一点:
<?php
while ($row = mysql_fetch_array($result)) {
extract $row;
$datetime *= 1000; // convert from Unix timestamp to JavaScript time
$data[] = "[$datetime, $value]";
}
?>
var chart = new Highcharts.Chart({
chart: {
renderTo: 'container'
},
series: [{
data: [<?php echo join($data, ',') ?>]
}]
});
var图表=新的Highcharts.图表({
图表:{
renderTo:“容器”
},
系列:[{
数据:[]
}]
});
谢谢您的回复。我一直在使用您发布的示例,并且对单个时间序列非常了解。然而,我的困惑在于多个系列的正确格式
我努力在PHP端处理数据,以获得正确格式的数据:
[
[
[time1, y1],
[time2, y2],
[time3, y3]
]
[
[time1, z1],
[time2, z2],
[time3, z3]
]
[
...
]
]
然而,在今天早些时候玩过一些东西并最终在白板上画出一个解决方案之后,我发现了一个似乎可行的解决方案,并要求我为每个系列遍历收集的数据数组一次。它可能不是最优的,但对于我测试它的几千个点来说效果很好。以下是我的代码供参考:
$seriesNames = array('Average Outdoor Temperature','Average Indoor Temperature');
foreach ($db->iterate($query) as $r) {
$time = (float)$r->RecDateTime;
$jstime = (float)($r->Timestamp*1000);
$avgOutdoorTemperature = (float)$r->avgOutdoorTemperature;
$avgIndoorTemperature = (float)$r->avgIndoorTemperature;
$dataArray[] = array(array($jstime, $avgOutdoorTemperature), array($jstime, $avgIndoorTemperature));
}
$arraySize = sizeof($dataArray);
$seriesNameSize = sizeof($seriesNames);
for ($i=0; $i<$seriesNameSize; $i++) {
$tempArray = array();
for ($j=0; $j<$arraySize; $j++) {
$tempArray[] = $dataArray[$j][$i];
}
$outputJSONArray[] = $tempArray;
}
echo json_encode($outputJSONArray);
$seriesNames=阵列(“平均室外温度”、“平均室内温度”);
foreach($db->迭代($query)为$r){
$time=(float)$r->RecDateTime;
$jstime=(浮动)($r->Timestamp*1000);
$avgoutdortemperature=(浮点)$r->avgoutdortemperature;
$avgindoor温度=(浮动)$r->avgindoor温度;
$dataArray[]=array(array($jstime,$avgOutdoorTemperature),array($jstime,$avgIndoorTemperature));
}
$arraySize=sizeof($dataArray);
$seriesNameSize=sizeof($seriesNames);
对于($i=0;$i)这只是一种预感,但我认为json_编码只有在键是字符串时才能正常工作;