Динамическое добавление данных, хранящихся в 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. Кто-нибудь может, пожалуйста, помочь мне это исправить?

Author: HoGo, 2012-11-27

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); ?>;
 3
Author: lupatus, 2012-11-27 12:43:24

Быстрый Ответ

Как указывалось ранее, эта проблема легко решается с помощью функции 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.

Ссылки

 1
Author: dreftymac, 2012-11-27 00:19:33
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";
}
?>
 0
Author: dev-null-dweller, 2012-11-26 23:00:40

Вы должны создать структуру данных в 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";
 0
Author: Musa, 2012-11-26 23:00:47