2016-06-21 11 views
1

データベースからメニューを表示する際にヘルプが必要です。私は成功し、次のコードから、メニューツリー開発した再帰関数、親、子、兄弟だけの動的メニューを表示する

global $menuItems; 
$menuItems = array(
[ 
    'id' => 1, 
    'name' => 
    'Main Menu 1', 
    'main' => 1, 
    'parent_id' => null 
], 
['id' => 9,'name' => 'Main Menu 2','main' => 1,'parent_id' => null], 
['id' => 10,'name' => 'Main Menu 3','main' => 1,'parent_id' => null], 
['id' => 11,'name' => 'Sub Menu 1.1','main' => null,'parent_id' => 1], 
['id' => 12,'name' => 'Sub Menu 1.2','main' => null,'parent_id' => 1], 
['id' => 13,'name' => 'Sub Menu 1.3','main' => null,'parent_id' => 1], 
['id' => 14,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12], 
['id' => 15,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12], 
['id' => 16,'name' => 'Sub Menu 3.1','main' => null,'parent_id' => 10,], 
['id' => 17,'name' => 'Sub Menu 3.2','main' => null,'parent_id' => 10], 
['id' => 18,'name' => 'Sub Menu 3.2.1','main' => null,'parent_id' => 17], 
['id' => 19,'name' => 'Sub Menu 3.2.2','main' => null,'parent_id' => 17]); 

foreach ($menuItems as $menu) { 
    $parentsIds[$menu['id']] = $menu['parent_id']; 
} 
function parseAndPrintTree($root, $tree) { 
    global $menuItems; 
    $return = array(); 
    if(!is_null($tree) && count($tree) > 0) { 
     echo '<ul>'; 
     foreach($tree as $child => $parent) { 
      if($parent == $root) {      
      unset($tree[$child]); 
      foreach ($menuItems as $row) { 
       if($row['id'] == $child) 
      echo "<li><a href='?menu=".$row['id']."'>".$row['name']. </a>"; 
      }  
      parseAndPrintTree($child, $tree); 
      echo '</li>'; 
     } 
    } 
    echo '</ul>'; 
    } 
} 

parseAndPrintTree(0,$parentsIds); 

それは、所望の出力を印刷し は、ここでは、データベーステーブルから配列の結果です。私は必要なもの

メニューがクリックするたびに、

  1. そのすべての子(クリックまで印刷されてはならない多くの子供を持つ場合)
  2. すべての兄弟
  3. ですそしてその親は根元に戻るparent_id=0

"on" 「ly」はparent_idが0である(子供ではない)他のメインメニューと共に画面に表示されます。

次の出力を生成する必要があります(手順)。最初のステップ1で

: "メインメニュー1" をクリック

: "サブメニュー1.2" をクリック

"メインメニュー3"

をクリックすると、 "サブメニュー3.2"

、クリックされたとき、私は両親とCHILDESを取得するため?menu={$row['id']}を渡すことが、理解できないのですすべての兄弟、親、子どもをどのように扱うか。

私はループ内のidとループ内のidを比較することを試みましたが、1つのレベルで大丈夫ですが、ツリーが2番目のレベルになると、最初の親(ルートに戻る)は印刷されません。

jQuery、Css(クラス)ではなくPHPでのみ必要です。私はしたくないのでプリント他のメニューは画面上に隠れているだけではありません。

+0

わからない以下のコードで上に行く:親に自分のアレイへの完全なパスを追加し、 (例えば、最初に再帰を実行するなどして)ノード自体に送信します。ノードがその値から始まって、選択されたノードの値で始まる場合にのみ、ノードを表示します(そして再帰的に再帰します)。例: 3.2.1の場合、ノードの値は「3.2.1」、親の値は「3.2」になります。ここで、選択したノード値がテスト対象ノードの親値で始まるノードのみを表示します(例:3.1の親パスは「3」、「3.2.1」は「3」で始まります)。 .2 "の親=" 3.1 "は" 3.2.1 "にありません) – Solarflare

+0

私はメニューの例を書いていますが、これは実際にはカテゴリに使用されます。その子カテゴリなどがあります。親にフルパスを追加すると、そのカテゴリが削除されるときにそのパスも更新する必要があります。だから私は問題を解決し、その複雑さを保存する可能な限り再帰でこれを見いだしています。 –

+0

はい、私はあなたがこれを再帰的に最初にやり直すことができたと言いました。一度だけ実行してパスを更新し(毎回または変更後にのみ)、別の再帰を実行して表示します。残念ながら、再帰を使用する場合は、1つの再帰だけで作業することはできません。もちろん、ノードの親があなたのdestノードを子として持つかどうかをテストする関数を書くことはできますが、これは再帰として機能し、遅くなります(より頻繁に実行されます)。実際にデータベースを使用している場合は、ネストされたセットを使用することができます(基本的にパスを提供します)が、兄弟はまだ問題がある可能性があります。 – Solarflare

答えて

0

コードはJS Jqueryではなくphpであると言いました。私はこれを試しました。それはあなたが必要としていたネストされた木の中であなたの配列を三回繰り返します。

ここにあなたの配列$メニューアイテムを定義し、あなたがタグ「mysqlの」追加しましたが、とにかく、なぜ

<ul> 
<?php 
    foreach($menuItems as $menu) 
    { 
     if($menu['main'] == 1) 
     { 
     ?> 
     <li> 
      <a href='<?= '?activeMenu='.$menu['id'] ?>'><?php echo $menu['name']; ?></a> 
      <?php 
      if(isset($_GET['activeMenu']) && $_GET['activeMenu'] == $menu['id']) 
      { 
      ?> 
       <ul> 
       <?php 
       foreach($menuItems as $submenu_level1) 
       { 
        if($submenu_level1['parent_id'] == $_GET['activeMenu']) 
        { 
        ?> 
         <li> 
          <a href='<?= '?activeMenu='.$_GET['activeMenu'].'&activeSubMenu='.$submenu_level1['id'] ?>'><?php echo $submenu_level1['name']; ?> 
         <?php 
          if(isset($_GET['activeMenu']) && isset($_GET['activeSubMenu']) && $_GET['activeMenu'] == $menu['id'] && $_GET['activeSubMenu'] == $submenu_level1['id']) 
          { 
           foreach($menuItems as $submenu_level2) 
           {  
           ?> 
            <ul> 
            <?php 
             if($submenu_level2['parent_id'] == $_GET['activeSubMenu']) 
             { 
            ?> 
              <li><a href='<?= $_SERVER['PHP_SELF'] ?>'><?php echo $submenu_level2['name']; ?></li> 
            <?php 
             } 
            ?> 
            </ul> 
           <?php 
           } 
          } 
         ?> 
         </li> 
        <?php 
        } 
       } 
       ?> 
       </ul> 
      <?php 
      } 
      ?> 
     </li> 
     <?php 
     } 
    } 
?> 
</ul> 
+0

サブメニュー1.2をクリックすると、サブメニュー1.2.1とサブメニュー1.2.2(サブメニュー第2レベルの子)が正しく表示されます。しかし、別のレベル、つまりサブメニュー1.2.2.Aとしてサブメニュー1.2.2の子メニューを追加すると、 ** $ menuItems ** '['id' => 20、 'name' => 'サブメニュー1.2.2.A'、 'メイン' =>ヌル、 'parent_id' => 15] ' 他の子レベル)。 それは底に反復しません、明らかにループは3レベル下にあります。可能であれば、ボトムレベルに束縛されない再帰型が必要です。 –

+0

ここに達する人は誰でも。それは私には明らかな答えではありませんでしたが、問題を解決するのに役立ちます。私は実際に何をしましたか、子供を5レベルに制限し、Vijay Wilsonのソリューションを実装しました。 –

関連する問題