2016-08-31 6 views
3

My Codeは動作していますが、これに満足していないので、非常に汚いです。 私の問題は、私のコードが繰り返されないようにするための関数を作ることができます。 私のコードはデータベースで繰り返しクエリを実行して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

これは '再帰 'のための良い仕事です。 Googleそれ:) –

+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

関連する問題