Проблема с рядом данных 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 имен серий (?!?!?!) внизу и не показывает точки на линейном графике.

Если я удалю двойные кавычки и жестко закодирую результат в массив серии, он отлично работает (хотя я заметил, что в примере нет запятой между объектами.

СПАСИБО за всю помощь ... особенно за быстрые ответы! ;-)


person gtr1971    schedule 08.11.2011    source источник
comment
Я обнаружил, что мой раздел $.each создает серию из 135 или около того, потому что в моей строке ответа столько символов. Так что $.each каким-то образом создает НОВЫЙ объект данных для каждого символа в строке. Должен ли я как-то анализировать JSON? Я почти готов просто отформатировать свой вывод в PHP и поместить его в переменную сеанса!   -  person gtr1971    schedule 09.11.2011


Ответы (5)


РЕШЕНО:

Я нашел ответ, который наконец сработал! Разочаровывает то, что это заняло у меня несколько дней, потому что это не было хорошо задокументировано Highcharts (и/или, возможно, мое понимание jQuert и JavaScript все еще находится на уровне новичка).

Ответ: не отправлять данные X/Y в виде предварительно сформированного массива в вашем объекте json, а вместо этого просто отправлять числа, составляющие дату (значение 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» ниже).

Затем вложите несколько циклов $.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);

И это должно быть так!

Надеюсь, кто-то еще найдет этот ответ полезным, и ему не нужно целыми днями бить себя по голове, пытаясь понять это. :-)

person gtr1971    schedule 17.11.2011

Поскольку метод Javascript UTC будет возвращаться с целым числом, будет лучше, если вы просто передадите Unix Timestamp как целое число, когда вы генерируете 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

person Tamas Kalman    schedule 07.06.2012

Только что проверил пример кода для 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'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 "]";

И это должно сделать это.

person sicks    schedule 13.11.2011
comment
Спасибо, больные... Мы с вами придумали похожие решения, но теперь я получаю результат диаграммы, показывающий ИМЯ, но не данные. - person gtr1971; 15.11.2011
comment
@sicks ... Проблема в том, что каждое имя имеет несколько наборов данных в массиве с датой и числом для координат x/y. Вот мой новый JSON: [{"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 2","data":["[Date.UTC(2011,11,08), 2 ]","[Date.UTC(2011,11,09), 2 ]","[Date.UTC(2011,11,10), 2 ]","[Date.UTC(2011,11,11), 2 ]","[Date.UTC(2011,11,14), 2 ]"]}] На диаграмме я получаю имена с разными цветами, но данные не отображаются на диаграмме. - person gtr1971; 15.11.2011
comment
рад, что вы поняли это, я старался изо всех сил! - person sicks; 18.11.2011
comment
Все в порядке... Я ценю, что вы нашли время и посмотрели документы, чтобы помочь мне разобраться. Это было непросто! - person gtr1971; 18.11.2011

Проверено в PHP5.5

Вы можете просто добавить это в json с рядом данных

$date = '31-12-2015 00:00:00';
$datetimeUTC = (strtotime($date) * 1000);
$data[] = [$datetimeUTC, (float) $value];
person Kunal Panchal    schedule 01.10.2015

Я столкнулся с проблемой отправки временных меток, созданных 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);
person Dimitri L.    schedule 26.05.2016