![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Zhulik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 5.6.2007 Репутация: нет Всего: нет |
Уважаемые разработчики !
Есть такая ситуация: с помощью РНР вывожу ддерево каталогов из Мускула. Главные и родительские элементы связаны с помощью таких полей id --- id_parent --- priority 1 --- 0 ... 2 --- 1 ... 3 --- 2 ..... Тоисть будет в результате так: 0 |_1 |_2 и т.д. Если главные каталоги выводить в порядке возростания приоритета, то как организовать функцию, которая добавляла бы новый каталог между существующими ? Тогда надо "сдвигать" приоритеты для каждого из рутов ? |
|||
|
||||
| rMaveric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 18.7.2003 Репутация: 3 Всего: 6 |
Думаю указывать приоритет вывода будет слишком накладно, если требуется жестко хранить положение элементов, то лучше делай линк на последующий элемент в списке. ТОгда в случае добавления (удаления) элемента тебе достаточно будет изменить всего 1 элемент, а не все элементы в подпапке.
-------------------- |
|||
|
||||
| rMaveric |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 18.7.2003 Репутация: 3 Всего: 6 |
Также подумай давать ссылку не только на последующий элемент, но и на предыдущий. Больше займет места в базе, но двигаться по элементам будет проще, например для удаления элемента.
-------------------- |
|||
|
||||
| WIPS |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 22.5.2006 Где: Украина, Киев Репутация: 1 Всего: 8 |
Zhulik, можно для задания приоритета использовать префиксное кодирование, тогда для вставки элемента между любыми двумя не придется сдвигать приоритеты других узлов. С префиксными кодами извращаться можно по разному, но для хранения в мускле наверное лучше всего использовать FLOAT (можно будет легко сортировать по приоритету при выборке).
Берем текущие приоритеты и записываем в виде: 0,00 0,01 ... 0,99 - величина и разрядность последнего приоритета зависит от к-ва вершин-рутов, хотя можно вставить первые две (приоритеты 0,0 и 0,1), а последующие добавлять по нижеописанному алгоритму. Алг. поясню на примере. Нам надо добавить вершину между 0,07 и 0,09. 1. Если делать втупую. Приоритет новой вершины будет просто плюс единица в следующий младший (след. младший для обоих чисел) разряд от первого числа (т.е. - 0,07 + 0,001 = 0,071). Но это подойдет если у нас добавляется не много вершин, т.к. следующая добавленая вершина (между 0,071 и 0,09) будет иметь приоритет 0,0711, потом 0,07111 и т.д., а точность FLOAT-а хоть и большая, но не бесконечная. 2. Можно анализировать оба числа не только на разрядность. Т.е. сначала мы вставляем 0,08 (т.е. если есть возможность прибавляем единицу не в след. младший разряд, а просто в младший), потом 0,081, 0,082 ... 0,089, 0,0891, 0,0892 и т.д. Придется конечно при вставке анализировать приоритеты "соседей", но зато можно не переколбашивать приоритеты всей таблицы P.S. Вопрос по моему совсем не по PHP, Zhulik, смотри перенесут твою тему куда нибудь в Алгоритмы и т.п. Это сообщение отредактировал(а) WIPS - 6.6.2007, 01:59 --------------------
Автопроизводители, машины, марки, модели! |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |