2016-08-31 41 views
3

我的代碼正在工作,但我對此不滿意,看起來很髒。 我的問題是,我如何使我的代碼功能不重複。 這裏是我的代碼,如何在PHP中重複查詢數據庫的功能

<?php 
// PARENT MENU 
$q2 = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = (SELECT MIN(parent) from userpage) ORDER BY t.sort ASC"; 
$r2 = $db->query($q2); 
$a2 = $db->fetch_all_array($q2); 
foreach($a2 as $k => $v) 
    { 
    $indent = "&#10149;"; 
    $tab = "&emsp;"; 
    $menu_id = $v['m_id']; 
    echo $v['pagename'] . "(" . $v['page'] . ")"; 
    // 1ST SUB MENU 
    if ($menu_id != '') 
     { 
     $q3 = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id . " ORDER BY t.sort ASC"; 
     $r3 = $db->query($q3); 
     $a3 = $db->fetch_all_array($q3); 
     foreach($a3 as $k3 => $v3) 
      { 
      $menu_id2 = $v3['m_id']; 
      echo $v3['pagename'] . "(" . $v3['page'] . ")"; 
      // 2ND SUB MENU 
      if ($menu_id2 != '') 
       { 
       $q4 = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id2 . " ORDER BY t.sort ASC"; 
       $r4 = $db->query($q4); 
       $a4 = $db->fetch_all_array($q4); 
       foreach($a4 as $k4 => $v4) 
        { 
        $menu_id3 = $v4['m_id']; 
        echo $v4['pagename'] . "(" . $v4['page'] . ")"; 
        // 3RD SUB MENU 
        if ($menu_id3 != '') 
         { 
         $q5 = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id3 . " ORDER BY t.sort ASC"; 
         $r5 = $db->query($q5); 
         $a5 = $db->fetch_all_array($q5); 
         foreach($a5 as $k5 => $v5) 
          { 
          $menu_id4 = $v5['m_id']; 
          echo $v5['pagename'] . "(" . $v5['page'] . ")"; 
          // 4TH SUB MENU 
          if ($menu_id4 != '') 
           { 
           $q6 = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id4 . " ORDER BY t.sort ASC"; 
           $r6 = $db->query($q6); 
           $a6 = $db->fetch_all_array($q6); 
           foreach($a6 as $k6 => $v6) 
            { 
            $menu_id5 = $v6['m_id']; 
            echo $v6['pagename'] . "(" . $v6['page'] . ")"; 
            // 5TH SUB MENU 
            if ($menu_id5 != '') 
             { 
             $q7 = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id5 . " ORDER BY t.sort ASC"; 
             $r7 = $db->query($q7); 
             $a7 = $db->fetch_all_array($q7); 
             foreach($a7 as $k7 => $v7) 
              { 
              $menu_id6 = $v7['m_id']; 
              echo $v['pagename'] . "(" . $v['page'] . ")"; 
              } //5th submenu 
             } //closing if for 5th submenu 
            } //4th submenu 
           } //closing if for 4th submenu 
          } //3rd submenu 
         } //closing if for 3rd submenu 
        } //2nd submenu 
       } //closing if for 2nd submenu 
      } //1st submenu 
     } //closing if for 1st submenu 
    } //parent menu 
?> 

謝謝。 任何答案是高度讚賞。

+2

這對'遞歸'是個不錯的任務。谷歌它:) –

+1

如果你可以向我們解釋你的代碼是做什麼的,這可能會有所幫助。評論你的代碼是一個普遍的編程勝利。嘗試並做到這一點。 – Martin

+0

謝謝你回答,你們是對的。 我的程序是將所有頁面顯示爲菜單格式。 – Luvz

回答

3

您可以更改您的代碼以使用遞歸。做到這一點的最簡單方法仍然會多次調用數據庫,但您不需要在代碼中全部使用它們。

調用下面的函數將寫出來的子菜單及其所有子/孫子等等

它的工作原理使用recursion在這種情況下是指函數調用自身來完成其任務。

function subMenu($menu_id) { 
    $q = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id . " ORDER BY t.sort ASC"; 
    $r = $db->query($q); 
    $a = $db->fetch_all_array($q); 
    foreach($a2 as $k => $v) 
    { 
     $menu_id2 = $v['m_id']; 
     echo $v['pagename'] . "(" . $v['page'] . ")"; 
     if ($menu_id2 != '') { 
      // write out the submenu of this submenu 
      subMenu($menu_id2); 
     } 
    } 
} 

隨着縮進計數器。通過0indent_count

function subMenu($menu_id, $indent_count) { 
    $q = "SELECT t.*, t2.id as m_id FROM userpage t left join menu t2 on (t2.parent=t.parent and t2.sort=t.sort) WHERE t.parent = " . $menu_id . " ORDER BY t.sort ASC"; 
    $r = $db->query($q); 
    $a = $db->fetch_all_array($q); 
    foreach($a2 as $k => $v) 
    { 
     $menu_id2 = $v['m_id']; 
     // You need to add in an indent based on $indent_count 
     echo $v['pagename'] . "(" . $v['page'] . ")"; 
     if ($menu_id2 != '') { 
      // write out the submenu of this submenu 
      subMenu($menu_id2, $indent_count + 1); 
     } 
    } 
} 
+0

非常感謝!這是我正在尋找的。 但我現在的問題是 - 我需要用縮影顯示它。 – Luvz

+1

沒問題。我已經給出了一個替代方案,說明如何跟蹤代碼的遞歸程度。 –

+0

不錯!你真是個天才!現在我明白了。謝謝!你解決了我的問題。 – Luvz