这是我在这里的第一个请求,我在同一个问题上阅读了许多其他相关帖子,但我仍然陷入困境,而且我的智慧结束了......所以任何帮助都很多理解!
我在Page1.php上有以下Highcharts对象,我在页面加载时使用AJAX从Page2.php获取数据,以及更改下拉选项时。
(为便于阅读而截断):
$(document).ready(function() {
var e = document.getElementById("selOption"); //<--- This is the dropdown
var domText = e.options[0].text;
var domID = e.options[e.selectedIndex].value;
var options = {
chart: {
renderTo: 'linechart',
type: 'line'
},
title: {
text: 'Title for ' + domText
},
subtitle: {
text: ''
},
xAxis: {
type: 'datetime',
dateTimeLabelFormats: {
month: '%b %e, %Y',
year: '%Y'
}
},
yAxis: {
title: {
text: 'Important Values'
},
reversed: true,
min: 0,
max: 100
},
tooltip: {
formatter: function() {
return '<b>'+ this.series.name +'</b><br/>'+
Highcharts.dateFormat('%b %e', this.x) +': '+ this.y;
}
},
series: []
};
$.get('Page2.php?domID=' + domID,function(data) {
$.each(data, function(key,value) {
//var series = {};
//series.name.push(value);
//series.data.push([value]);
options.series.push(data);
//alert(data);
});
var linechart = new Highcharts.Chart(options);
});
});
Page2.php发送回json:
$sqlSelect = "SELECT Item1,Item2,Item3 FROM... ";
$result = mysql_query($sqlSelect);
while ($item = mysql_fetch_assoc($result)) {
$name = $item['Item1'];
$date = str_replace("-",",",$item['Item2']);
$pos = $item['Item3'];
$arr = array("name"=>$name,"data"=>"[Date.UTC(".$date."), ".$pos." ],");
echo json_encode($arr);
}
我的json回归看起来像这样:
{"name":"Item1","data":"[Date.UTC(2011,11,08), 4 ],"}
{"name":"Item1","data":"[Date.UTC(2011,11,08), 2 ],"}
当我的图表加载时,它会在底部填写135系列名称(?!?!?!),并且似乎不会显示折线图上的点。
如果我删除双引号并将结果硬编码到系列数组中,它的效果很好(尽管我注意到这个示例似乎没有逗号之间的逗号。
感谢您的帮助......尤其是快速回复! ; - )
答案 0 :(得分:15)
<强>解决:强>
我找到了一个终于有效的答案!令人沮丧的是,我花了好几天因为Highcharts没有很好地记录(和/或者我对jQuert和JavaScript的理解仍然处于新手级别)。
答案是 不 在您的json对象中将X / Y数据作为预先形成的数组发送,而只是发送组成Date的数字(x值)和值(y值)作为json对象中逗号分隔值的列表,然后进行解析并推送客户端。
例如:我最初试图让我的PHP发送类似
的内容[{"name":"Name 1","data":["[Date.UTC(2011,11,08), 4 ]","[Date.UTC(2011,11,09), 4 ]","[Date.UTC(2011,11,10), 4 ]","[Date.UTC(2011,11,11), 4 ]","[Date.UTC(2011,11,14), 3 ]"]}
但我真正需要做的是发送类似
的内容[{"name":"Name 1","data":["2011,11,08, 4","2011,11,09,4"....`
第一步是确保将“系列”选项设置为空数组series: []
(我之所以提到这一点是因为我看到了其他答案,其中有不同的做法)。
然后在你的getJSON函数中,你需要为你所引入的每个对象创建一个新对象,其中还包括一个空的“数据”数组(参见下面的“var series”)。
然后嵌套几个$.each
循环来解析并将数据推送到必要的数组中,并填充每个对象的“名称”:
$.getJSON('http://exmaple.com/getdata.php?ID=' + id, function(data) {
$.each(data, function(key,value) {
var series = { data: []};
$.each(value, function(key,val) {
if (key == 'name') {
series.name = val;
}
else
{
$.each(val, function(key,val) {
var d = val.split(",");
var x = Date.UTC(d[0],d[1],d[2]);
series.data.push([x,d[3]]);
});
}
});
options.series.push(series);
});
在上面的代码之后,您需要实例化图表:
var chart = new Highcharts.Chart(options);
那应该是它!
希望其他人觉得这个答案很有用,并且不需要花费数天时间试图解决这个问题。 : - )
答案 1 :(得分:3)
由于Javascript UTC方法将以Integer返回,因此当您在服务器端生成JSON而不是尝试在JSON中传递函数(UTC.Date)时,将Unix时间戳作为整数传递会更好 - 这使得整个JSON无效!
所以
而不是这个
while ($item = mysql_fetch_assoc($result)) {
$name = $item['Item1'];
$date = str_replace("-",",",$item['Item2']);
$pos = $item['Item3'];
$arr = array("name"=>$name,"data"=>"[Date.UTC(".$date."), ".$pos." ],");
echo json_encode($arr);
}
这样做:
while ($item = mysql_fetch_assoc($result)) {
$name = $item['Item1'];
$unix_date = date("Y-m-d", strtotime($item['Item2']));
$pos = $item['Item3'];
$arr = array("name"=>$name,"data"=>"[".($unix_date*1000).", ".$pos." ],");
echo json_encode($arr);
}
请注意我们将PHP unix时间戳乘以1000以使其与JS兼容。
答案 2 :(得分:2)
只需检查一些Highcharts的示例代码,series
需要是一个JSON对象数组,每个对象包含{"name":"Item1","data":"[Date.UTC(2011,11,08), 4 ],"}
等。
主要问题是page2的输出,不是数组。
您需要首先修复$ .each,您需要推送value
,而不是data
:
$.each(data, function(key,value) {
options.series.push(value);
});
这将正确地将每个项目串联设置为完整的json对象。
然后修复输出:
$output = [];
while ($item = mysql_fetch_assoc($result)) {
$name = $item['Item1'];
$date = str_replace("-",",",$item['Item2']);
$pos = $item['Item3'];
//I don't think there's supposed to be a comma after this square bracket
$arr = array("name"=>$name,"data"=>"[Date.UTC(".$date."), ".$pos." ]");
array_push($output, json_encode($arr));
}
echo "[";
foreach($output as $val){
echo $val;
if($val != end($output)) echo ",";
}
echo "]";
那应该这样做。
答案 3 :(得分:0)
在PHP5.5中检查
您可以使用数据系列
将其添加到json中$date = '31-12-2015 00:00:00';
$datetimeUTC = (strtotime($date) * 1000);
$data[] = [$datetimeUTC, (float) $value];
答案 4 :(得分:0)
我遇到了发送由mktime()生成的时间戳的问题,因为highcharts需要UTC时间而PHP时间戳不是UTC。数据可能会在图表中的错误日显示,因此您还必须考虑时区。
function _convertToUTC($timeStamp) {
return (int)$timeStamp + (int)date('Z', $timeStamp);
}
代码示例如下:
$serie = array(
'name' => 'title',
'data' => array(
// multiply timestamp by 1000 to get milliseconds
array(_convertToUTC(mktime(0,0,0,1,1,2016)) * 1000, 15),
array(_convertToUTC(mktime(0,0,0,2,1,2016)) * 1000, 18),
array(_convertToUTC(mktime(0,0,0,3,1,2016)) * 1000, 13),
),
);
echo json_encode($serie);