2010-03-24 52 views
0

我需要创建一个“nth”子类别的树形菜单。我决定使用我的表结构的邻接表模型,因为我不会更新这个表,这似乎是最容易实现我的使用。从存储在表中的数据创建无序列表树菜单与邻接列表模型... php

我要使用样式“UL”和“礼”的标签输出......我已经有一个CSS和jQuery的解决方案做造型。我的问题来自于将数据从数据库中提取出来,并使用PHP的递归函数来构建列表......列表是一个连接的字符串,它被解析为构建树。我真的很难让关闭的“ul”和“li”标签排列在他们需要的位置。

这是最好的方法吗?有没有其他更好的方式使用数组或类似的东西来做到这一点?任何你可以指向我的“最佳实践”的例子来构建这样的列表将不胜感激。谢谢。

这里是我的表结构:

portfolio_id(INT),p_name(VARCHAR),parent_portfolio_id(INT) 这就是我想要的数据看起来像呈现在:

<ul> 
<li>Portfolio Name 
    <ul> 
     <li>Sub portfolio A 
      <ul> 
       <li>Sub portfolio A - 1</li> 
       <li>Sub portfolio A - 2</li> 
       <li>Sub portfolio A - 3</li> 
      </ul> 
     </li> 
     <li>Sub portfolio B</li> 
     <li>Sub portfolio C</li> 
    </ul> 
</li> 
</ul> 

这里的电流递归函数:

function portf($ndb, $portfolio_id, $space=1, $x="", $level=1) // cat id, space to add "_" degree of categoreis times, list of categories 
{ 
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;"; 
    $select = $ndb->get_results($sql, 0, ARRAY_A); 
    if(!is_null($select)) 
    { 
     foreach($select as $data) 
     { 
      $x = $x . $data->portfolio_id . '_' . $data->parent_portfolio_id . '_' . $level . str_repeat('_', $space) . $data->p_name . '-'; 
      $x = $this->portf($ndb, $data->portfolio_id, ($space+1), $x, ($level+1)); 
     } 
     return $x; 
    } 
    else 
    { 
     return $x; 
    } 
} 
+0

这将帮助,如果你表现出一定的代码... – GrumpyCanuck 2010-03-25 01:16:02

+0

添加了一些示例代码...感谢名单 – Ronedog 2010-03-25 04:05:37

回答

1

我不得不承认,你有点让我失去了你的一些代码。最新的所有$空格和str_repeat?

无论如何,这是我想尝试的。

function portf($ndb, $portfolio_id, $level=1) 
{ 
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;"; 
    $select = $ndb->get_results($sql, 0, ARRAY_A); 

    if(!is_null($select)) 
    { 
     $li = ""; 
     foreach($select as $data) 
     { 
      $sublist = portf($ndb, $data->portfolio_id, $level+1); 
      $li .= "<li>{$data->p_name}{$sublist}</li>"; 
     } 
     $ul = "<ul class=\"level_$level\">$li</ul>"; 
     return $ul; 
    } 
    else 
    { 
     return ""; 
    } 
} 
+0

感谢您的帮助......我很困惑自己。我从Google上获得了这些代码,这是另一种提取数据的方式。它的工作,但不是一个菜单,有多个子类别的关系,它真的很混乱。无论如何,我已经发布了一些额外的代码,以向您展示您的建议输出结果......几乎正是我需要的......查看帖子。如果您有任何其他提示,我会很乐意尝试。再次感谢。 – Ronedog 2010-03-25 16:02:14

+0

我想我可能在逻辑中犯了一个非常简单的错误 - 在foreach循环中,我每次都覆盖li。我编辑了函数来连接而不是覆盖。 – 2010-03-25 18:25:33

+0

这是完美的!对于anyoneelse谁走来只是一个微小的变化......在这里你有$ UL =“”,我想你的意思是“

    没有斜杠。总之,谢谢你帮我。3天谷歌搜索,搜索尝试不同的事物是让我疯狂,你的解决方案做了我想要的,并可能花了你几分钟的时间来想出!再次感谢。 – Ronedog 2010-03-25 19:26:55