#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:
Комментарии:
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)
},