При не очень большом объеме выводимых элементов организовать их иерархический вывод проще всего на php.
Для этого нам потребуется вот такая структура
id | pid | name
id - это ид текущего элемента
pid - это ид родительского элемента (для элемента первого уровня это значение примем 0)
name - это имя элемента
Фактически, это структура таблицы в базе данных.
Получить массив данных из базы очень просто
SELECT * FROM table ORDER BY pid, id
Теперь сам скрипт вывода
// это наш массив из базы, но для примера задаю данные в пхп массиве $data = array( array('id' => 1, 'pid' => 0, 'name' => '1'), array('id' => 2, 'pid' => 1, 'name' => '1.1'), array('id' => 3, 'pid' => 2, 'name' => '1.1.1'), array('id' => 4, 'pid' => 0, 'name' => '2'), array('id' => 5, 'pid' => 0, 'name' => '3'), array('id' => 6, 'pid' => 5, 'name' => '3.1'), array('id' => 7, 'pid' => 5, 'name' => '3.2'), ); //теперь создаем массив в виде дерева $tree = array(); foreach ($data as $row) { $tree[(int) $row['pid']][] = $row; } //ну и рекурсивная функция для вывода дерева function treePrint($tree, $pid=0) { if (empty($tree[$pid])) return; echo '<ul>'; foreach ($tree[$pid] as $k => $row) { echo '<li>'; echo $row['name']; if (isset($tree[$row['id']])) treePrint($tree, $row['id']); echo '</li>'; } echo '</ul>'; } //вызов функции treePrint($tree);
Результат должен быть таким
11.11.1.1 2 3 3.1 3.2