Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Рекурсивная функция, определить уровень вложенности

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Делается многоуровневое меню.
TheKIP
Отправлено: 12 Октября, 2011 - 10:48:45
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Есть рекурсивная функция, которая строит меню из базы. В базе все свалено в одну таблицу, где наследование родитель-потомок осуществляется по столбцам parent и id

Функция просто проходит по все пунктам и составляет многомерный массив. Но мне понадобилось что бы он еще и строил правильные ссылки, с вложенностью. В базе они находятся только со своим кейвордом (выборка идет по нему).

PHP:
скопировать код в буфер обмена
  1.  
  2.         function getBrothers($id, $uri, $path="", $level=0, $items=array())
  3.         {
  4.                 $qGetItem = "SELECT name, keyword, id FROM ".$this->db->dbprefix('content')." where visible=1 and parent=?";
  5.                 $res = $this->db->query($qGetItem, array($id));
  6.                 $out = $res->result_array();
  7.        
  8.                 if (count($out) == 0) {
  9.                          return false;
  10.                 }
  11.                 else {
  12.                
  13.                         foreach ($out as $index => $row)
  14.                         {
  15.                         $path = $path."/".$row['keyword'];
  16.                         $out[$index]['link'] = $path; //составляем, правильный, сегментированный uri
  17.                        
  18.                         if (in_array($row['keyword'], $uri)) $out[$index]['act'] = true; else $out[$index]['act'] = false;   //делаем подсветку активных пунктов в меню
  19.                        
  20.                         $out[$index]['childs'] = $this->getBrothers($row['id'], $uri, $path, $level, $items)) //детишки
  21.        
  22.                         }
  23.                 }
  24.                 return $out;
  25.         }
  26.  


Вот строке 16, где комментарий "составляем правильный регламентированный ури" и есть интересующая меня часть кода.
Я хочу чтоб из тех кейвордов что берутся из базы состовлялось что то вроде level/sublevel1/sublevel2/ и т.д. где каждый сегмент это keyword отдельного пункта.

Они должны наращиваться по мере углубления вовнутрь. Но при моей реализации они наращиваются не только в глуб, но и в ширь, т.е. добавляются кейворды братьев, т.е. при каждом запуске рекурсии...

Вот я никак не могу додуматься как сделать так, что бы функция понимала что она сейчас находится на одном уровне, и добавляла сегменты только при переходе к следующему вложенному сегменту.

Я уже пытался сделать путем ввода счетчика, (в параметрах функции осталась переменная level), но счетчик так же увеличивается при каждом запуске рекурсии, и как ограничить область видимости я так и не додумался.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB