Возможный дубликат:
Превратите результат базы данных в массивПривет парни, может Вы помогать мне. Как получить иерархическую 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
Два прохода 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) Итерировать по родительскому массиву и получить дочерние элементы, используя идентификатор родительского элемента. Сохранить результат в массив и добавить как элемент текущего родительского массива, используя «дочерние элементы» в качестве ключа.
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);
?>