Как получить иерархическую php структуру от таблицы базы данных в массиве php или JSON [дубликат]

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

Привет парни, может Вы помогать мне. Как получить иерархическую php структуру от таблицы базы данных, в массиве 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"
  }
]

Таблица My SQL содержит поля: ИДЕНТИФИКАТОР, РОДИТЕЛЬ, ПОРЯДОК, ЗАГОЛОВОК

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

Заранее большое спасибо. Daniel

1
задан Bhavesh Gangani 21 July 2017 в 16:18
поделиться

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;    
    }
}
2
ответ дан 3 September 2019 в 00:42
поделиться

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

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

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

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);
?> 
0
ответ дан 3 September 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: