Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите разобраться - что не так с рекурсией?
 
 автор: Enso   (05.06.2012 в 00:41)   письмо автору
 
 

Приветствую уважаемые коллеги.

Возникла непонятная ситуация, никак не пойму в чём дело...

Есть таблица в БД со страницами. Каждая страница может быть родителем другой, соответственно:

page_id | page_name | page_parent_id
==================================
1| Раздел 1 | 0
2| Раздел 2 | 0
3| Подразд 1 | 1 // первый уровень вложенности
4| Подразд 2 | 1
5| Подразд 1-1 | 3 // второй уровень вложенности
6| Подразд1-1-1| 5 // третий уровень вложенности

Да, да знаю - деревья, рекурсия - тут всё понятно. НО... вытаскиваю я все страницы из БД, дабы сформировать меню разделов, формирую массив определённого вида и в нём мне нужно установить самого первого прародителя, чтоб в определённой ветке отображать только соответствующее меню. Т.е. в ветке прародителя "Раздел 1" у меня должно быть нечто вроде:

Раздел 1 (заголовок)
+----------------+
Подразд 1 (Link)
Подразд 2 (Link)

Подразд 1 (заголовок)
+----------------+
Подразд 1-1 (Link)

Подразд 1-1 (заголовок)
+----------------+
Подразд1-1-1 (Link)

Это условно.
В общем всё работает, единственная проблема с определением id прародителя.
Написал рекурсивную функцию для определения id прародителя:
Функция принимает ссылку на массив со всей выборкой из БД и значение прямого родителя для данной страницы.

function get_parent(&$res_arr, $page_parent_id)
    {
        for($c = 0; $c < count($res_arr); $c++)
        {
            if($res_arr[$c]['page_id'] == $page_parent_id) // проверяем строку прямого родителя 
            {
                if ($res_arr[$c]['parent_id'] == 0) // true если достигли верха иерархии
                {
                    return $res_arr[$c]['page_id'];
                }
                else // значит ищем прямого родителя данного раздела и проверяем его уровень
                {
                    get_parent($res_arr, $res_arr[$c]['parent_id']);
                }
            }
        }
    }

Почему-то она находит прародителя (parent_id =0) только если он через уровень от проверяемой строки, т.е. для второго уровня вложенности, а для третьего уже не находит. (уровни вложенность в примере таблицы выше)

Никак не пойму в чём дело? Помогите, пожалуйста.

  Ответить  
 
 автор: Enso   (11.06.2012 в 17:28)   письмо автору
 
   для: Enso   (05.06.2012 в 00:41)
 

Приветствую коллеги.
Хоть бы ради приличия кто-нибудь взглянул. Тут просто пример подробно расписан, но в суть вопроса то вникнуть минуту займёт. Благодарю.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования