![]() |
сортировка по нескольким полям(с данными) одновременно врядли может понадобиться...
|
метод для обмена двух узлов:
Код:
function SwapNodes($categoryID1, $categoryID2) |
Когда будешь вводить внешний индекс сортировки, его нужно строить так, чтобы сохранялась структура дерева. То есть помимо простой сортировки нужно будет учитывать и сортировку по left. Это влечет как минимум дополнительные вычисления. А в общем идея здравая.
Цитата:
Для проверки удачного/неудачного чтения данных достаточно возавращать false в последнем случае и тогда не совсем верная конструкция (процитированная) превратится в немного более сложную Код:
if (false === ($nodeInfo1 = $this->getNodeInfo($categoryID1)) return false; |
тут бы вообще надо создавать новый экземпляр класса, с копирующим конструктором, но я не знаю, как это сделать в php.
|
Цитата:
|
подводя итоги. не хватает методов:
InsertTo MoveTo т.е. вставлять/двигать узел(целиком) в конкретную позицию. Clone клонировать узел. Одиночное удаление узла. Но это вобщем не сложно и не к спеху:) если кто знает где найти алгоритмы, прошу ссылку:) |
InsetTo и Clone по сути одно и то же если речь идет о копировании существующего узла.
Решать можно так: 1. Выбираем поддерево с корнем в нужном нам узле. 2. Вызываем рекурсивный метод добавления дерева в дерево:) (пишется за 10 минут) С переносом сложнее.. там нужно сохранить и идентификаторы, но как вариант, можно сначала скопировать куда-нибудь в переменную поддерево, которое переносим, удалить его и вставить в нужное место с указанием всех данных (кроме left, right и level) Sheryld Цитата:
|
нет. я хочу одним запросом, чтобы было в том же стиле, что и все остальные запросы:) в выходные устроим очередной мозговой штурм:)
и кстати, насчет рекурсивного метода не понял. к чему он тут? |
рекурсивный метод -- самый простой способ решить эту задачу. не всегда правда оптимальный.
Теперь давай смотреть на структуру дерева. При добавлении N узлов нужно увеличить left и right всех узлов "правее" нового на 2*N. При удалении этих же N узлов -- на 2*N. Теперь дальше. При изменении родителя узла нужно изменить left, right и level. С последним все ясно. с left и right дело обстоит так: новый left (и right) узлов, который перенесли и всех узлов "правее" нужно увеличить на разность right родителя и left исходного. Я не слишком сильно оптимизировал это место, поскольку обновление происходит по индексу да и операция переноса выполняется крайне редко (в моем случае). Выглядит это так 1. Сдвигаю дерево для новых узлов 2. Меняю left и right указанного узла и его детей так, чтобы они заполнили пустое место. 3. Ещё раз сдвигаю дерево. Если оптимизировать до одного запроса, то нужно ставить в запрос условия на left и right. выделять нужно три варианта: 1. узел между тем, в который вставляют и тем который вставляют. 2. узел внутри того, который вставляют. 3. узел после того, который вставляют. Первую группу сдвигаем "вправо" на количество вставляемых узлов. Для второй группы изменяем родителя. Третью сдвигаем "влево" на количество вставляемых узлов + изменяем level этих узлов. Направления "вправо" и "влево" чисто условные. Определить их можно так: Если вставляемый узел выше (в таблице отсортированной по left) того, в который вставляют, то "вправо" - это увеличение индексов, "влево" - уменьшение. В противном случае -- наоборот :) Кажется так. И относится это только к переносу. Для копирования я так и не придумал ничего лучше рекурсивного перебора всех узлов, которые нужно скопировать. |
Часовой пояс GMT +4, время: 19:45. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.