2011-09-24 39 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