Вывод данных серии Highcharts с помощью ajax/json и PHP
Это мой первый запрос здесь, и я прочитал многие другие связанные сообщения по этой же проблеме, но я ВСЕ ЕЩЕ ЗАПРЕЩАЮСЯ, и в значительной степени на мой взгляд на этом... Так что любая помощь много оценили!
У меня есть следующий объект Highcharts на Page1.php, и я использую 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 Series (?!?!?!) внизу и не отображает точки на графике.
Если я удалю двойные кавычки и жесткий код с результатом в массив рядов, он отлично работает (хотя я заметил, что пример не имеет запятой между объектами.
СПАСИБО за всю помощь... особенно быстрые ответы!; -)
Ответы
Ответ 1
РЕШИТЬ:
Я нашел ответ, который наконец сработает! Разочарование того, что мне потребовалось несколько дней, потому что он не был хорошо документирован Highcharts (и/или, может быть, мое понимание jQuert и JavaScript все еще находится на начальном уровне).
Ответ не отправляет данные X/Y в виде предварительно сформированного массива в ваш json-объект, а вместо этого просто посылает числа, которые составляют дату (значение x) и значение (y value) как список значений, разделенных запятыми, в объекте 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);
И это должно быть!
Надеюсь, кто-то еще найдет этот ответ полезным и не должен биться себя над головой в течение нескольких дней, пытаясь понять это.: -)
Ответ 2
Так как метод Javascript UTC будет возвращаться с помощью Integer, это просто лучше, если вы просто передадите отметку времени Unix как целое число, когда вы создаете JSON на сервере, вместо этого пытаетесь передать функцию (UTC.Date) в JSON - это делает весь JSON недействительным!
So
Вместо этого
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.
Ссылка: http://www.w3schools.com/jsref/jsref_utc.asp
Ответ 3
Только что проверили с некоторым примером кода для Highcharts, series
должен быть массивом объектов JSON, каждый из которых содержит {"name":"Item1","data":"[Date.UTC(2011,11,08), 4 ],"}
и т.д.
Основная проблема заключается в том, что ваш вывод из страницы2 не является массивом.
Сначала вам нужно исправить ваш $.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 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 "]";
И это должно сделать это.
Ответ 4
Проверено в PHP5.5
Вы можете просто добавить это в json с серией данных
$date = '31-12-2015 00:00:00';
$datetimeUTC = (strtotime($date) * 1000);
$data[] = [$datetimeUTC, (float) $value];
Ответ 5
Я столкнулся с проблемой отправки временных меток, созданных mktime(), потому что highcharts ожидает UTC, тогда как PHP Timestamp не 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);