Дерево вывода структуры PHP MySQL - PullRequest
1 голос
/ 04 февраля 2011

Я пытаюсь оптимизировать дизайн «многие ко многим», который будет возвращать древовидную структуру. Данные выглядят так:

таблица страниц: идентификатор, заголовок, подзаголовок, класс таблица коннекторов страниц: id, page_id, parent_id, section

если раздел = x, для каждого родителя, у которого есть дети, где разметка section = x должна выглядеть примерно так:

--- start parent 1 ---
 -- if first parent echo *
<>* parent page id | parent title<>
--- parent 1 children --- 
   <>child page id | child title<>
   <>child page id | child title<>
   <><>child page id | child title<>
--- end parent 1 ---
--- start parent 2 ---
 -- if first parent echo *
<>parent page id | parent title<>
--- parent 2 children --- 
   <>child page id | child title<>
   <>child page id | child title<>
   <>child page id | child title<>
--- end parent 2 ---

Эта реализация, кажется, работает хорошо, но я не могу понять, как изменить функции, чтобы вернуть метку, как указано выше:

    // Menu builder function, parentId 0 is the root
function buildMenu($parent, $menuData)
{
   $html = "";
   if (isset($menuData['parents'][$parent]))
   {
      $html .= "
      <ul>\n";
       foreach ($menuData['parents'][$parent] as $itemId)
       {
          if(!isset($menuData['parents'][$itemId]))
          {
             $html .= "<li>\n  <a href='".$menuData['items'][$itemId]['link']."'>".$menuData['items'][$itemId]['label']."</a>\n</li> \n";
          }
          if(isset($menuData['parents'][$itemId]))
          {
             $html .= "
             <li>\n  <a href='".$menuData['items'][$itemId]['link']."'>".$menuData['items'][$itemId]['label']."</a> \n";
             $html .= buildMenu($itemId, $menuData);
             $html .= "</li> \n";
          }
       }
       $html .= "</ul> \n";
   }
   return $html;
}
echo buildMenu(0, $menuData);

1 Ответ

0 голосов
/ 27 февраля 2011

Ваша структура данных кажется странной. Насколько я могу судить, ваша структура $ menuData выглядит следующим образом:

$menuData = array(
  "parents" => array( ... ),
  "items" => array( 
    0 => array( "link" => "...", "title" => "...", ... ),
    1 => array( "link" => "...", "title" => "...", ... )
  )
);

В построенных мной иерархических структурах они выглядели примерно так:

$menuData = array(
    array( "id" => 1, parent_id => 0, "link" => "...", "title" => "...", ... ),
    array( "id" => 2, parent_id => 1, "link" => "...", "title" => "...", ... )
  )
);

Возможно, это ограничение на контекст, в котором вы работаете, но просто говорит: более простая структура делает более простой код.

Что касается вашего рекурсивного алгоритма генерации дерева, если он действительно генерирует то, что вы ищете (по крайней мере, неупорядоченную структуру списка), вам нужно только поэкспериментировать с добавлением "<>" и "- "штук, где вы хотите между конкатенациями <li> и </li>. Однако у вас будет проблема со звездочкой для «первого» родителя. Если вы хотите поставить звездочки во все пункты меню верхнего уровня, вы должны установить необязательный параметр в buildMenu, например:

function buildMenu($parent, $menuData, $level = 0);

Затем измените ваш рекурсивный вызов следующим образом:

$html .= buildMenu($itemId, $menuData, ++$level);

И добавить условие для определения, когда $ level == 0

$html .= "<li>\n  " . ( $level == 0 ? "*" : "") . "<a href='".$menuData['items'][$itemId]['link']."'>".$menuData['items'][$itemId]['label']."</a>\n</li> \n";

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...