Я пытаюсь сделать файловый браузер в виде дерева, и у меня проблема как-то его отсортировать. Я использую для этого PHP и MySQL. Я создал смешанный (вложенный набор + смежность) элемент таблицы со следующими полями:
element_id, left_key, right_key, level, parent_id, element_name, element_type (enum: 'folder','file'), element_size.
Не будем сейчас обсуждать, что информацию об элементе (имя, тип, размер) лучше перенести в другую таблицу.
Функция сканирования указанного каталога и заполнения таблицы работает корректно. Примечательно, что я добавляю элементы в дерево в определенном порядке: сначала папки, а затем файлы.
После этого я могу легко получить и отобразить всю таблицу на странице с помощью простого запроса:
SELECT * FROM element WHERE 1=1 ORDER BY left_key
С результатом этого запроса и другой функции я могу сгенерировать правильный HTML-код (<ul><li>... and so on). для отображения дерева.
Теперь вернемся к вопросу (наконец, да?). Я изо всех сил пытаюсь добавить функцию сортировки. Например, я хочу упорядочить результат по размеру. Здесь мне нужно помнить всю иерархию дерева и правил: сначала папки, потом файлы.
Я считаю, что могу сделать это, сгенерировав в PHP рекурсивный запрос:
SELECT * FROM element WHERE parent_id = {$parentId} ORDER BY element_type (so folders would be first), size (or name for example) asc/desc
После этого для каждого результата с типом = 'folder' я отправлю еще один запрос, чтобы получить его содержимое.
Также можно получить целое дерево с помощью left_key и после этого отсортировать его в PHP как массив, но я думаю, что это было бы хуже :)
Интересно, есть ли лучший и более эффективный способ сделать это?