"Функция-мутосилка" массива
Есть примерно такая таблица.
- id : autoincrement :
- parent : int : одно из значений поля id или 0
- name : varchar : исключительно для удобства
- flag : int : некоторый флаг для выборки
Нужно из всех(!) записей, который удовлетворяют условию
выборки (по флагу) и сортировке (по id, например) построить дерево по данной таблице.
Обычная ситуация без всяких проверок.
Мы выбираем последовательно все элементы, например у кого parent = 0,
потом для каждого из них у кого parent уже равно ... ну, Вы поняли, как всегда делается.
Загвоздочка в следующем для моей задачи.
Если у меня один элемент потомок (*) будет находиться внутри элемента,
который не прошел проверку по флагу, но который (*) прошел бы проверку в выборке,
если бы рассматривался, то его я не увижу в дереве. А обязательно должен видеть.
Но видеть уже должен как элемент с уровнем вложенности равным 0, ну и дальше для
него должны быть выбраны все "элементы-дети"
Пример.
id | parent | name | flag
1 0 A 1
2 1 B 1
3 2 C 2
4 3 D 1
5 4 E 1
Примерный запрос: select ... where flag = 1
При постройках мы не получим элемент "D" и "E" в дереве,
так как не получим элемент "C" с флагом равным 2.
Так вот при такой ситуации я должен всеже получить:
0 => A
-> B
1 => D
-> E
Единственное решение, которое нашел я - выбрать все записи
одним запросом и крутить полученный массив.
У меня много работы и без этого, поэтому нужна помощь.
Требования.
- К полям id,parent,name,flag при сортировках и перестановках элементов
добавляем еще одно поле innerLevel, которое считаем самостоятельно.
В примере, если бы мы не придирались к флагу, для D это значение было бы 3,
а для E - 4, считая от нуля. С придираниями же получим, что для D - 0, E - 1.
- Подробное комментирование своего кода.
Оплачиваемые пожелания.
- Если у Вас есть убедительные доводы, что Ваш метод очень хороший
и практически единственный, +2 пойнта к 5-и изначальным.
Это я увижу по коду ;)
Для великолепного комментария.
- Сделать все действительно красиво, а писать я умею :)
Как буду проверять.
- Закачивайте скрипт на свой хост.
print_r (исходный массив)
работа функции
print_r (дерево)
Если я всеже что-то неясно объяснил или все готово,
а может что и упустил, ввиду усталости, то стучитесь.
ICQ#: 480-526-137