Динамическое добавление данных, хранящихся в php, во вложенный json
Я пытаюсь динамически генерировать данные в json для диаграммы Ганта jQuery. Я знаю PHP, но полностью знаком с JavaScript. Я прочитал дюжину решений о том, как динамически добавлять данные в json, и попробовал несколько десятков комбинаций и ничего. Вот формат json:
var data = [{
name: "Sprint 0",
desc: "Analysis",
values: [{
from: "/Date(1320192000000)/",
to: "/Date(1322401600000)/",
label: "Requirement Gathering",
customClass: "ganttRed"
}]
},{
name: " ",
desc: "Scoping",
values: [{
from: "/Date(1322611200000)/",
to: "/Date(1323302400000)/",
label: "Scoping",
customClass: "ganttRed"
}]
}, <!-- Somoe more data-->
}];
Теперь у меня есть все данные в результате php db. Вот оно:
$rows=$db->fetchAllRows($result);
$rowsNum=count($rows);
И вот как я хотел создать json из этого:
var data='';
<?php foreach ($rows as $row){ ?>
data['name']="<?php echo $row['name'];?>";
data['desc']="<?php echo $row['desc'];?>";
data['values'] = {"from" : "/Date(<?php echo $row['from'];?>)/", "to" : "/Date(<?php echo $row['to'];?>)/", "label" : "<?php echo $row['label'];?>", "customClass" : "ganttOrange"};
}
Однако это не работает. Я пробовал без петли и замена переменных php простым текстом просто для проверки, но это тоже не сработало. Отображает диаграмму без добавленных элементов. Если я добавлю новый элемент, добавив его в список значений, это сработает. Таким образом, нет никаких проблем с самим Гантом или путями. Исходя из всего вышесказанного, я предполагаю, что проблема заключается в добавлении простых данных в json. Кто-нибудь может, пожалуйста, помочь мне это исправить?
4 answers
Прежде всего, вы добавляете свойства в строку вместо построения объекта. Если вы действительно хотите сделать это таким образом:
var data = [], row;
<?php foreach ($rows as $row) : ?>
row = {};
row.name ="<?php echo $row['name'];?>";
row.desc ="<?php echo $row['desc'];?>";
row.values = {"from" : "/Date(<?php echo $row['from'];?>)/", "to" : "/Date(<?php echo $row['to'];?>)/", "label" : "<?php echo $row['label'];?>", "customClass" : "ganttOrange"};
data.push(row);
<?php endforeach; ?>
В любом случае это небезопасно (и результатом является обычный код JS, а не правильный объект JSON - но поскольку вы присваиваете его переменной, я полагаю, что он не должен быть в строгом формате JSON)
Лучшим подходом было бы построить структуру данных на PHP и использовать функцию json_encode
для генерации данных JSON для JavaScript:
<?php
$data = array();
foreach ($rows as $row) {
$data[] = array(
'name' => $row['name'],
'desc' => $row['desc'],
'values' => array(array(
'from' => '/Date('.$row['from'].'>)/',
'to' => '/Date('.$row['to'].')/',
'label' => $row['label'],
'customClass' => 'ganttOrange',
))
);
}
?>
var data = <?php echo json_encode($data); ?>;
Быстрый Ответ
Как указывалось ранее, эта проблема легко решается с помощью функции PHP json_encode.
Хитрость в понимании того, как это легко сделать, состоит в том, чтобы понять составную структуру данных, с которой вы пытаетесь работать.
Обзор
То, с чем вы имеете дело, - это общая концепция программирования, называемая "составной структурой данных". Хитрость в понимании этого состоит в том, чтобы осознать, что PHP и JavaScript, которыми вы пытаетесь управлять, - это всего лишь два разных представления одного и того же.
Как только эта концепция усвоится, будет легко соотнести ее с тем, что уже объяснили пользователи Musa и dev-null-житель.
Простой способ решить эту проблему - просто построить составную структуру данных в PHP, а затем перевести ее в JSON (он же JavaScript), используя встроенные собственные методы PHP json_encode и json_декод.
Вместо того, чтобы выполнять все инструкции, вы должны рассматривать каждую строку $ как составную структуру данных и использовать функции PHP json.
Следующий пример должен дать вам преимущество, просто сравните его с данными, с которыми вы пытаетесь работать, и измените соответственно.
Пример 001
// This is a PHP composite data structure [ a nested array ]
// represented in PHP. When you run this code you will get the
// output of Result 001
$user_profile = Array(
main => Array(
first_name => "_blank_",
last_name => "_blank_",
sex => "_blank_",
age => "_blank_",
),
guardian => Array(
first_name => "",
last_name => "",
),
children => Array(
0 => Array(
first_name => "Sally",
last_name => "Shaw",
),
1 => Array(
first_name => "Scott",
last_name => "Shaw",
),
),
);
// This is some sample PHP code you can use to modify
// the composite data structure (modify the "_blank_" values)
//
$user_profile["main"]["first_name"] = "Archibald";
$user_profile["main"]["last_name"] = "Shaw";
$user_profile["main"]["age"] = "33";
$user_profile["main"]["sex"] = "male";
// This is some sample PHP code you can use to modify
// the composite data structure (add a new child)
//
$user_profile["children"][2] = Array();
$user_profile["children"][2]["first_name"] = "Carrie";
$user_profile["children"][2]["last_name"] = "Shaw";
// This is the PHP code you can use to transform from PHP to JSON
$result = json_encode( $user_profile );
print_r( $result );
Результат 001 (отформатирован для удобства чтения)
{
"main":{
"first_name":"Archibald",
"last_name":"Shaw",
"sex":"male",
"age":"33"
},
"guardian":{
"first_name":"",
"last_name":""
},
"children":[
{
"first_name":"Sally",
"last_name":"Shaw"
},
{
"first_name":"Scott",
"last_name":"Shaw"
},
{
"first_name":"Carrie",
"last_name":"Shaw"
}
]
}
Заключение
Используя приведенный выше пример, вы должны сначала выполнить print_r переменной PHP, с которой вы пытаетесь работать, и получите представление об общей структуре. Как только вы это узнаете, вам будет легко преобразовать его в JSON с помощью встроенной функции PHP json_encode.
Ссылки
var data=[];
<?php
foreach ($rows as $row)
{
$obj = array(
'name' => $row['name'],
'desc' => $row['desc'],
'values' => array(
array(
"from" => "/Date({$row['from']})/",
"to" => "/Date({$row['to']})/",
"label" => $row['label'],
"customClass" => "ganttOrange",
)
)
);
$objJson = json_encode($obj);
echo "data.push({$objJson});\n";
}
?>
Вы должны создать структуру данных в php и повторить ее с помощью json_encode.
<?php
$data = array();
foreach ($rows as $row){
$item = array();
$item['name']=$row['name'];
$item['desc']=$row['desc'];
$item['values']= array("from" => "/Date{$row['from']})/",
"to" => "/Date({$row['to']})/",
"label" => $row['label'],
"customClass" => "ganttOrange");
$data[] = $item;
}
echo "\nvar data = ".json_encode($data).";\n";