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
Форумы портала PHP.SU :: Версия для печати :: Рекурсивная функция, определить уровень вложенности
Форумы портала PHP.SU » » Вопросы новичков » Рекурсивная функция, определить уровень вложенности

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

1. TheKIP - 12 Октября, 2011 - 10:48:45 - перейти к сообщению
Есть рекурсивная функция, которая строит меню из базы. В базе все свалено в одну таблицу, где наследование родитель-потомок осуществляется по столбцам 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), но счетчик так же увеличивается при каждом запуске рекурсии, и как ограничить область видимости я так и не додумался.

 

Powered by ExBB FM 1.0 RC1