Я пытаюсь сделать файловый браузер в виде дерева, и у меня возникла проблема с его сортировкой.
Я использую PHP и MySQL для этого. Я создал смешанную (вложенный набор + смежность) таблицу 'element' со следующими полями:
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
После этого для каждого результата, имеющего type = 'folder', я отправлю еще один запрос, чтобы получить его содержимое.
Также возможно получить целое дерево по left_key и после этого отсортировать его в PHP как массив, но я думаю, что будет хуже:)
Интересно, есть ли лучший и более эффективный способ сделать это?