Как заполнить ось Highcharts данными в формате строки из массива PHP

#php #javascript #highcharts

#php #javascript #highcharts

Вопрос:

Я пытаюсь преобразовать массив элементов php в метки для оси X Highcharts. Пример по умолчанию:

 categories: ['Jan','Feb','Mar','Apr', 'May', 'Jun', 
                    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
  

Итак, у меня есть массив PHP ($items) и в итоге получается массив Javascript (элементы var). Firebug выводит следующее:

 console.log(items);
["item1_10_20", "item2_2011_10_14", "item3_2011_10_07", "item3_2011_09_12"]
  

Я вижу, что вместо этого у меня должны быть одинарные кавычки. Как я могу это сделать? Или, может быть, мне следует вместо этого заполнить Highcharts строкой, разделенной запятой и одинарными кавычками? Как мне это сделать?


Редактировать

Я пробовал это, но безуспешно!

в моем файле представления у меня есть скрипт javascript:

 var items = "'<? echo join("','", $items) ?>'"; // Note the enclosing single quotes
  

И в файле Highcharts JS:

 xAxis: {
 categories: [items]
},
  

Весь массив помещается в первое значение оси x, а остальные значения являются пустыми. Переменная item отображается в firebug:

 'item1_2011_10_20','item2_2011_10_14','item3_2011_10_07','item4_2x1_2011_09_12'
  

Насколько странно, что это не работает?


Редактировать

При использовании json_encode для форматирования массива php я все еще не могу заставить highcharts распознать массив. Если я вручную скопирую и жестко закодирую массив с помощью одинарных кавычек, это сработает. Но мне действительно нужно передать массив из php в js highcharts через переменные.

Вот результирующая ось x с массивом через json_encode: Диаграмма с неправильной осью x

Комментарии:

1. Есть ли причина, по которой вы не можете распечатать массив PHP в середине массива JS? Экс. категории: [‘<? echo join(«‘,'», $items); ?>’]

2. Сначала я попробовал это, но объявил переменную и передал ее в javascript. В моем случае PHP в файле представления, а JS выполняется в другом файле. таким образом, Highcharts поместил весь массив в качестве первого элемента на оси x. Остальные значения оси остаются пустыми.

Ответ №1:

Следующее уже является массивом —

 ["item1_10_20", "item2_2011_10_14", "item3_2011_10_07", "item3_2011_09_12"]
  

итак, измените следующее

 xAxis: {
    categories: [items]
},
  

следующим образом —

 xAxis: {
    categories: items
},
  

Обновить:

 xAxis: {
    categories: eval('('   items   ')')
},
  

Update2:

Одна вещь, которую вам нужно знать, это то, что JSON — это не Javascript. Вы получаете ответ get JSON с сервера, который является не чем иным, как строкой в Javascript. Итак, чтобы использовать этот ответ JSON в Javascript, вам нужно проанализировать JSON для формирования структуры данных Javascript, такой как object, array и т. Д. (Точно так же, как мы делаем с XMl), Что называется синтаксическим анализом.

Существует множество библиотек синтаксического анализа JSON, но мы также можем использовать eval функцию JS для выполнения этой работы, если безопасность не вызывает беспокойства.

И в вашем случае ответ JSON представляет собой массив, который вы используете eval , чтобы превратить его в настоящий массив Javascript.

Итак, items это JSON, и вы используете eval ( eval('(' items ')') ) для синтаксического анализа, который возвращает массив Javascript, а затем присваиваете результат categories .

Комментарии:

1. Этот массив генерируется с помощью php и json_enconde. Результат по-прежнему не нравится highcharts, я опубликую скриншот выше.

2. Спасибо, Бхеш!! Не могли бы вы объяснить, что именно изменилось с этим «eval»?

3. @Landitus: Добро пожаловать. Объяснение см. В обновлении.

Ответ №2:

У меня была такая же проблема с массивом c #, я решаю ее таким образом с помощью razor :

 @{
    string[] myIntArray = new string[5] {"Apples", "Oranges", "Pears", "Grapes", "Bananas" };
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var jsVariable = serializer.Serialize(myIntArray);  
}


xAxis: {
    categories: @Html.Raw(jsVariable)
 },