我正在尝试动态地在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添加普通数据。有人可以帮我解决一下吗?
答案 0 :(得分:3)
首先,您要将属性添加到字符串而不是构建对象。如果你真的想这样做:
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
函数为JavaScript生成JSON数据:
<?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); ?>;
答案 1 :(得分:1)
快速回答
如前所述,使用PHP json_encode函数可以轻松解决此问题。
理解如何轻松完成此操作的技巧是了解您尝试使用的composite data structure。
<强>概述强>
您正在处理的是一种称为&#34;复合数据结构&#34; 的通用编程概念。理解这一点的诀窍是要意识到你试图管理的PHP和JavaScript只是完全相同的两个不同的表示。
一旦这个概念陷入其中,就很容易与用户 Musa 和 dev-null-dweller 已经解释过的内容联系起来。
解决此问题的直接方法是在PHP中构建复合数据结构,然后使用PHP的json_encode和json_decode的内置本机方法将其转换为JSON(也称为JavaScript)。
不应该执行所有语句,而应将每个$行视为复合数据结构并使用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"
}
]
}
<强>结论强>
使用上面的示例,您应首先执行您尝试使用的PHP变量的print_r,并了解整体结构。一旦你知道这一点,使用内置的PHP json_encode函数将它转换为JSON是一个简单的步骤。
<强>参考强>
答案 2 :(得分:0)
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";
}
?>
答案 3 :(得分:0)
您应该在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";