JSON для jqPlot

Я хотел бы использовать jqPlot, используя данные со стороны сервера, поступающие в формате JSON, как описано в этом примере: http://www.jqplot.com/tests/data-renderers.php

Мой код почти такой же, как в примере:

function myGraph(jsonurl) {

  var ajaxDataRenderer = function(url, plot, options) {
    var ret = null;
    $.ajax({
      // have to use synchronous here, else the function
      // will return before the data is fetched
      async: false,
      url: url,
      dataType:"json",
      success: function(data) {
        ret=data;
        console.warn(data);
      }
    });
    return ret;
  };



var plot1 = $.jqplot('chartdiv', jsonurl, {
      title: 'myTitle',
      dataRenderer: ajaxDataRenderer,
      dataRendererOptions: {  unusedOptionalUrl: jsonurl    },
      series: [{
          label: 'myLabel',
          neighborThreshold: -1
      }],
      axes: {
          xaxis: {
              renderer: $.jqplot.DateAxisRenderer,
            //  min:'August 1, 2010 16:00:00',
              tickInterval: '2 months',
              tickOptions:{formatString:'%Y-%m-%d.%H:%M:%S'}
          },
          yaxis: {
              tickOptions:{formatString:'$%.2f'}
          }
      },
  });

На стороне сервера я использую PHP (и Yii). Веб-страница возвращает массив, который кодируется в JSON с помощью CJSON::encode($resultArray); (эта функция Yii передается через функцию кодирования PHP JSON). Результаты PHP-скрипта выглядят так:

{"2011-04-25 14:46:40":2,"2011-04-26 14:46:40":3,"2011-04-27 14:46:40":5}

Запрос Ajax на стороне клиента разрешил что-то вроде этого (вывод из console.info(); )

Object { 2011-04-25 14:46:40=2,  2011-04-26 14:46:40=3, ...}

Вероятно, jqPlot ожидает следующий формат:

[[["2011-04-25 14:46:40":0],["2011-04-26 14:46:40",3],["2011-04-27 14:46:40",0]]]

Все время я получаю error uncaught exception: [object Object] Что не так? Есть ли способ преобразовать объект в типичную форму массива?

Спасибо


person The Bndr    schedule 14.07.2011    source источник


Ответы (4)


У меня есть что-то вроде этого. У меня было 2 массива для значений, меток. Вы должны построить строку, как показано ниже, из массивов.

        $size = count($labels);

        for ($i = 0; $i < $size; $i++) {
            $result = $result . "['" . $labels[$i] . "'," . $values[$i] . "]";
            if($i != $size -1 ){
                $result = $result . ",";
            }
        }

ИЛИ если у вас нет 2 массивов и есть только эта строка {"2011-04-25 14:46:40":2,"2011-04-26 14:46:40":3,"2011-04-27 14 :46:40":5} вы можете заменить { на [ , } на ] и , на ],[ . Грязное, но быстрое решение.

После приведенного выше кода вам может потребоваться добавить «[» и «]» с обеих сторон и возвращаемое значение.

person Pit Digger    schedule 14.07.2011
comment
Я думаю, что создание строки на стороне PHP, которая выглядит как массив JS, является скорее обходным путем. Но это единственный способ, который работает. Кстати, я должен разобрать строку на стороне клиента с помощью eval. Что означает: resultArray=eval(данные) - person The Bndr; 15.07.2011
comment
Это очень глупо для новичка, но jqPlot ожидает свои данные в формате [[val1, val2, val3]]. Спасибо за подсказку здесь. - person kontur; 23.04.2012

Не парсить результат на стороне клиента, jquery справится намного лучше. На самом деле массив, который вам нужен для jqplot, на самом деле является действительным json. Все, что вам нужно сделать, это подготовить данные и создать соответствующую структуру массива в PHP:

$pairs = array(1=>2, 3=>5, 4=>7, 5=>12, 7=>23); // simple example

$result = array();

foreach ($pairs as $label => $value) {
    $result[] = array($label,$value); // make a "small" array for each pair
}

echo json_encode(array($result)); // wrap the result into another array; multiple plot data go like "array($result, $result2, ...)"

Результат выглядит следующим образом:

[[[1,2],[3,5],[4,7],[5,12],[7,23]]] 

и это именно то, что вам нужно.

person dee38    schedule 26.02.2012

Из http://www.jqplot.com/tests/date-axes.php

Примечание. Хотя jqPlot анализирует почти любую удобочитаемую дату, по возможности безопаснее использовать метки времени JavaScript. Кроме того, лучше указать дату и время, а не только дату. Это связано с непоследовательной обработкой браузером местного времени по сравнению с UTC с голыми датами.

И пример данных с сайта:

var line1=[['2008-09-30 4:00PM',4], ['2008-10-30 4:00PM',6.5], ['2008-11-30 4:00PM',5.7], ['2008-12-30 4:00PM',9], ['2009-01-30 4:00PM',8.2]];

Итак, вам нужен массив, заполненный массивами из 2 элементов. Первая строка с датой (используйте метку времени, если можно) и значением X. Я пытался найти формат ввода для синтаксического анализа даты и времени или что-то в этом роде, но безрезультатно.

Вы создали

{"2011-04-25 14:46:40":2,"2011-04-26 14:46:40":3,"2011-04-27 14:46:40":5}

который является объектом с 3 полями. Имя первого поля — «2011-04-25 14:46:40», а его значение равно 2. Вам нужно сгенерировать такой массив:

[["2011-04-25 14:46:40", 0],["2011-04-26 14:46:40", 3],["2011-04-27 14:46:40", 0]]

JSFiddle с вашими данными работает, так что временные метки не нужны;) http://jsfiddle.net/zpygcvps/ 1/

person Jacob Sobus    schedule 22.10.2014

синусоида с функцией PHP json_encode

серверная часть

<?php

    $y = array();

    $index = 0 ;
    for($x = 0 ; $x< 13 ; $x += 0.5) {
        $y[$index] =  sin($x);
        $index++ ;
    }

    $series = array();
    $series[0] = $y ;
    $data = json_encode($series);
    echo $data;

?>

сторона клиента

<script type="text/javascript">
        $(document).ready(function(){

            var ajaxDataRenderer = function(url, plot, options) {
            var ret = null;
            $.ajax({
              async: false,
              url: url,
              dataType:"json",
              success: function(data) {
                ret = data;
              }
            });
            return ret;
          };

        // The url for our json data
        var jsonurl = "/test/chart/jqplot-data.php";

        var plot2 = $.jqplot('chartdiv', jsonurl,{
            title: "AJAX JSON Data Renderer",
            dataRenderer: ajaxDataRenderer,
            dataRendererOptions: {
              unusedOptionalUrl: jsonurl
            }
          });

        });
    </script>
person rjha94    schedule 27.08.2012