2016-08-31 37 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