#javascript #php #json #chart.js2
#javascript #php #json #chart.js2
Вопрос:
У меня есть набор данных, который должен быть в том же формате, что и переменная JavaScript, как показано ниже:
var theData = {
datasets: [
{
label: "My First dataset",
backgroundColor: "rgba(179,181,198,0.2)",
borderColor: "rgba(179,181,198,1)",
data: [65, 59, 90, 81, 56, 55, 40]
},
{
label: "My Second dataset",
backgroundColor: "rgba(255,99,132,0.2)",
borderColor: "rgba(255,99,132,1)",
data: [28, 48, 40, 19, 96, 27, 100]
}
],
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"]
};
Данные создаются на PHP, но я не могу получить их таким образом.
Вот что у меня есть в PHP (примерные данные, но тот же метод их заполнения):
$data = array();
$data['datasets'][1]['label'] = "First Data Set";
$data['datasets'][1]['borderColor'] = "rgba(30, 87, 153, .9)";
$data['datasets'][1]['backgroundColor'] = "rgba(30, 87, 153, .5)";
$data['datasets'][2]['label'] = "Afternoon";
$data['datasets'][2]['borderColor'] = "rgba(41, 137, 216, .9)";
$data['datasets'][2]['backgroundColor'] = "rgba(41, 137, 216, .5)";
// Loop through some foreachs and fill the $data
// Not the actual loop I use but same principle
foreach ($theData as $data)
{
$data['datasets'][1]['data'][] = data;
}
foreach ($otherData as $data)
{
$data['datasets'][2]['data'][] = data;
}
Это возвращается обратно в JavaScript с помощью a json_encode();
когда я это делаю console.log(JSON.stringify(theData))
, я получаю это:
{
"datasets":{
"1":{
"label":"Morning",
"borderColor":"rgba(125, 185, 232, .9)",
"backgroundColor":"rgba(125, 185, 232, .5)",
"borderWidth":1,
"data":[
"24",
0,
0,
"30",
"24",
"36",
"36"
]
},
"2":{
"label":"Afternoon",
"borderColor":"rgba(41, 137, 216, .9)",
"backgroundColor":"rgba(41, 137, 216, .5)",
"borderWidth":1,
"data":[
"24",
0,
0,
"24",
"24",
"30",
"36"
]
}
},
"labels":[
"Sun Aug 14",
"Mon Aug 15",
"Tue Aug 16",
"Wed Aug 17",
"Thu Aug 18",
"Fri Aug 19",
"Sat Aug 20"
]
}
Это для Chart.js 2.3. Образец данных сверху находится непосредственно из Chart.js примерные данные. Приведенный выше JSON — это мои результаты. Поскольку они не идентичны, диаграмма не работает. Могу ли я изменить свой PHP, чтобы сделать его более похожим на образец в самом верху?
Комментарии:
1. Почему вы не использовали json_encode ($data) в своем PHP
2. @KickingLettuce Было бы полезно, если бы вы создали массив обычным способом.
$data['datasets'] = array(); $data['datasets'][] = array('label' => 'First Data Set', ...
3. Пожалуйста, сделайте. Это единственный способ убедиться, что полученные данные находятся в правильном формате JSON.
4. @Rishabh Извините, я что-то неправильно понял. Я использую его. Извините, что возвращаюсь к этому вопросу.
5. Ответ @Machavity правильный
Ответ №1:
Давайте начнем с самого начала
theData
является лиobject
datasets
являетсяarray
лиobjects
labels
является лиarray
Итак, давайте приступим к созданию этого
$data = array();
$data['datasets'] = array();
$data['datasets'][] = array("label" => "First Data Set",
"borderColor" => "rgba(30, 87, 153, .9)",
"backgroundColor" => "rgba(30, 87, 153, .5)"
);
$data['datasets'][] = array("label" => "Second Data Set",
"borderColor" => "rgba(41, 137, 216, .9)",
"backgroundColor" => "rgba(41, 137, 216, .9)"
);
$data['labels'] = array("Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running");
echo json_encode($data);
Как уже упоминалось, json_encode
выполняет всю работу за вас, как только вы создаете массив
{
"datasets": [
{
"label": "First Data Set",
"borderColor": "rgba(30, 87, 153, .9)",
"backgroundColor": "rgba(30, 87, 153, .5)"
},
{
"label": "Second Data Set",
"borderColor": "rgba(41, 137, 216, .9)",
"backgroundColor": "rgba(41, 137, 216, .9)"
}
],
"labels": [
"Eating",
"Drinking",
"Sleeping",
"Designing",
"Coding",
"Cycling",
"Running"
]
}
Комментарии:
1. да, его работа, я не видел такого массива в массиве, спасибо за разъяснение
2. Это выглядит как хороший способ сделать это, позвольте мне протестировать. Спасибо.
3. Я не понимаю, почему, если я устанавливаю свои ключи как `$data [‘datasets’] [1]
, instead of
$data [‘datasets’] [], вместо этого он преобразует его из массива объектов в объект объектов (по крайней мере, на основе способаJSON.stringify(theData)
печати.)4. @KickingLettuce Это из-за того, как должен работать JSON. Допустим, вы установили ключ
1
, но не ключ0
.json_encode
сохранит этот1
ключ, преобразовав его в объект JSON. Помните, что в JS нет реальных ассоциативных массивов, подобных PHP