Я хотел бы отобразить структуру данных с помощью плагина jquery Fancytree. После долгих поисков в Google кажется, что лучший способ сохранить структуру данных в базе данных — это модель Nested Set (описана здесь в Stackoverflow). php / Mysql лучшая древовидная структура ). Однако сделать связанный вложенный JSON такой структуры для отображения довольно сложно, я не смог этого сделать ..
Это состоит в том, чтобы преобразовать следующую таблицу MySQL:
| 1 | ЭЛЕКТРОНИКА | 1 | 20 | 0 |
| 2 | ТЕЛЕВИДЕНИЯ | 2 | 9 | 1 |
| 3 | ТРУБА | 3 | 4 | 2 |
| 4 | LCD | 5 | 6 | 2 |
| 5 | ПЛАЗМА | 7 | 8 | 2 |
| 6 | ПОРТАТИВНАЯ ЭЛЕКТРОНИКА | 10 | 19 | 1 |
| 7 | MP3-ПЛЕЕРЫ | 11 | 14 | 2 |
| 8 | FLASH | 12 | 13 | 3 |
| 9 | CD-проигрыватели | 15 | 16 | 2 |
| 10 | 2 WAY RADIOS | 17 | 18 | 2 |
В этот JSON:
[{"key": "1", "title": "ELECTRONICS", "expanded": true, "children": [
{"key": "2", "title": "TELEVISION", "expanded": true, "children": [
{"key": "3", "title": "TUBE"},
{"key": "4", "title": "LCD"},
{"key": "5", "title": "PLASMA"}
]},
{"key": "6", "title": "PORTABLE ELECTRONICS", "expanded": true, "children": [
{"key": "7", "title": "MP3 PLAYERS", "expanded": true, "children": [{"key": "8", "title": "FLASH"}]},
{"key": "9", "title": "CD PLAYERS"},
{"key": "10", "title": "2 WAY RADIOS"}
]}
]}]
Я хотел бы знать, существует ли простой способ преобразования данных MySQL в иерархически вложенный JSON?
Спасибо!
Наконец, мне удалось заставить мое дерево работать, постепенно создавая JSON. Я не думаю, что это правильно, так как он не состоит из объекта и массива, но это, кажется, работает нормально
<?php
if (!isset($DB_connection)) { require_once('../config/_db_connect.php'); }
$result = $DB_connection->prepare("SELECT node.category_id, node.name,
(COUNT(parent.name) - 1) AS depth FROM nested_category AS node,
nested_category AS parent WHERE node.lft BETWEEN parent.lft
AND parent.rgt GROUP BY node.name ORDER BY node.lft;");
$result->execute();
$i = 0;
$nb_open = 0;
$current_level = '';
echo "[{";
while( $line = $result->fetch(PDO::FETCH_OBJ) )
{
if ($current_level == '') { $current_level = $line->depth; }
if ($current_level == $line->depth) { if ($i > 0) { echo " }, {"; } }
elseif ($current_level < $line->depth) {
echo ', "children": [ { ';
$nb_open = $nb_open + 1;
}
elseif ($current_level > $line->depth) {
$nb_to_close = $current_level - $line->depth;
for ($j = 1; $j <= $nb_to_close; $j++) {
$nb_open = $nb_open - 1;
echo " }]";
}
echo "}, {";
}
echo ' "title": "' . $line->name . '", "key": "' .
$line->category_id . '", "expanded": true';
$current_level = $line->depth;
$i++;
}
if ($nb_open>0) { for ($i = 1; $i <= $nb_open; $i++) { echo "}]"; } }
echo "}]";
?>
Других решений пока нет …