动态地将存储在php中的数据添加到嵌套的json中

时间:2012-11-26 22:48:50

标签: php javascript json nested

我正在尝试动态地在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 个答案:

答案 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";