Как получить иерархическую структуру 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);
?>