Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Есть примерно такая таблица.

- 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

17 лет назад
meww
36 летБеларусь
17 лет в сервисе
Был
10 лет назад
Выбранный исполнитель
MasterBit
Гость 
39 летРоссия
17 лет в сервисе
Был
11 лет назад
17 лет назад
$5
Проявил смекалку и показал отличные знания SQL. Опередил задание и сделал часть моей последующей работы над полученным результатом. Рекомендую (!!!)
Работа с Евгением была первой моей работой на поприще фриланса. Честно говоря, я даже не ожидал такого хорошего взаимодействия и расположения ко мне как к подрядчику, ведь я предложил решение, не совсем удовлетворяющее условиям задания. Тем не менее, Евгений сам развил мысль по решению задачи, а вознаграждение перевел без задержек. Рекомендую работать с ним!