2011-09-24 88 views
1

我的导航表看起来像这样。 enter image description here反转面包屑问题

它基于父母< - >孩子计划。

我正在使用以下代码来生成面包屑。

function makeBreadcrumb($current, $lang, $db){ 
     $q = $db->query("SELECT id, parent, $lang AS name FROM nav WHERE id = '$current'"); 
     $row=$q->fetch_object(); 
     echo "<li>"; 
      echo '<a href="?id=' . $row->id . '">' . $row->name . '</a>'; 
      echo "</li>\n\n"; 
    if($row->parent) makeBreadcrumb($row->parent, $lang, $db); 
    } 

但得到扭转面包屑:它显示child>parent代替parent>child 。如何解决呢?

+0

什么决定哪些页面是父母,哪些是孩子 - 菜单栏? – Nightfirecat

+0

你不看“父”列吗?它突出显示在屏幕截图 –

+0

哦,只是注意到 - 看起来你太晚调用递归函数就是问题,就像ArtoAle在他的回答中所说的那样。 – Nightfirecat

回答

3

的解决方案是很容易的......你可以简单地把递归调用之前echo statment,像这样:

function makeBreadcrumb($current, $lang, $db){ 
     $q = $db->query("SELECT id, parent, $lang AS name FROM nav WHERE id = '$current'"); 
     $row=$q->fetch_object(); 
    if($row->parent) makeBreadcrumb($row->parent, $lang, $db); 
     echo "<li>"; 
      echo '<a href="?id=' . $row->id . '">' . $row->name . '</a>'; 
      echo "</li>\n\n"; 

    } 

但我raccomend你不要为每个节点做一个查询在树上。这可能是非常资源丰富的。

+0

+1除了对每个节点进行查询通常是最不昂贵的方法。假设你在该表中有10K条记录,则你不会获取所有记录来构建3个节点的面包屑。在这种情况下,一个好的解决方案是使用**准备好的语句**。 – netcoder

+0

“假设您在该表中有10K条记录,则您不会获取所有记录以构建3个节点的面包屑。”你没看到WHERE id ='$ current''吗? –

+0

@ L0rd DEVdem0rt:那不重要。要点是,这是最便宜的方法,你没有选择。你会最终发现它。 – netcoder