Как получить иерархическую структуру php из таблицы db, в массиве php или в формате JSON

Возможный дубликат:
Превратить результат базы данных в массив

Привет, ребята, не могли бы вы помочь мне. Как получить иерархическую структуру php из таблицы db, в массиве php или JSON, но в следующем формате:

[
  {
     "attributes":{
        "id":"111"
     },
     "data":"Some node title",
     "children":[
        {
           "attributes":{
              "id":"555"
           },
           "data":"A sub node title here"
        }
     ],
     "state":"open"
  },
  {
     "attributes":{
        "id":"222"
     },
     "data":"Other main node",
     "children":[
        {
           "attributes":{
              "id":"666"
           },
           "data":"Another sub node"
        }
     ],
     "state":"open"
  }
]

Моя таблица SQL содержит поля: ID, PARENT, ORDER, TITLE

Можете ли вы помочь мне с этим? Я схожу с ума, пытаясь получить это.

Спасибо заранее. Даниил

2 ответа

Два прохода foreach делают свое дело. Это рекурсивно свяжет всех детей с их родителями.

$structure = array();
foreach( $array as $row ) { //add rows to array by id
    $structure[ $row["id"] ] = $row + array( "children" => array() );
}
foreach( $structure as &$row ) { //link children to parents
    if( ! is_null( $row["parent"] ) ) {
        $structure[ $row["parent"] ]["children"][] =& $row;    
    }
}

Метод, который вы используете для хранения ваших данных, называется моделью списка смежности. Чтобы иметь возможность достичь того, что вам нужно. Следуй этим шагам.

1) Получить родительские элементы и сохранить их в массив / хэш.

2) Перебирайте родительский массив и извлекайте дочерние элементы, используя идентификатор родителя. Сохраните результат в массив и добавьте в качестве элемента текущего родительского массива, используя "children" в качестве ключа.

3) JSON кодирует результирующий массив.

<?php
    $sql    = "SELECT * FROM yourtable WHERE PARENT is NULL or PARENT = 0";
    $result = $db->query($sql);  //a valid MySQL database adapter with a 
                                 //"query" method which returns the full result set.
    $arr = array();
    foreach($result as $row) {
       $sql = "SELECT * FROM yourtable WHERE PARENT = {$row['id']}";
       $result2 = $db->query($sql);
       $row["children"] = $result2;
       $arr[] = $row;
    }
    echo json_encode($arr);
?>

Для получения дополнительной информации о восстановлении иерархии данных в таблицах такого типа читайте статью Рома " Извлечение иерархий данных в таблице SQL".

Кроме того, примите меры предосторожности в этой реализации. Хотя это выглядит легко реализуемым, следите за количеством итераций, связанных с вызовами внешних ресурсов, в данном случае с вашим сервером базы данных. Итеративный вызов запросов выбивает из этого дерьмо, вызывая проблемы с производительностью в будущем. Если это так, вы можете применить технику, аналогичную Кендаллу Хопкинсу (хотя я не уверен, почему он использовал вызов by-ref для $row). Больше информации об итерационных вызовах внешних ресурсов здесь.

<?php
$sql = "SELECT * FROM yourtable";
$result = $db->query($sql);
$arr = array();
//re-index the result array based on their actual IDs
foreach ($result as $row) {
    $arr[$row['ID']] = $row;
}
foreach ($arr as $item) {
    if (!empty($item["PARENT"]) && $item["PARENT"] != 0) {
       $arr[$item["PARENT"]]["children"][] = $item;
       //unset the discovered child item to clean-up array and release memory allocation 
       unset($arr[$item["ID"]]);
    }
}
echo json_encode($arr);
?> 
Другие вопросы по тегам