2016-06-21 3 views
1

Ich brauche Hilfe bei der Anzeige von Menüs aus der Datenbank. hier Array resultieren aus Datenbanktabelle:Rekursionsfunktionen, Um dynamische Menüs nur mit Eltern, Kindern und Geschwistern anzuzeigen

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]); 

ich erfolgreich Menübaum aus folgenden Code entwickelt haben:

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); 

Er druckt gewünschte Ausgabe.

Was ich brauche, jedes Mal, wenn ein Menü angeklickt wird,

  1. Alle seine Kinder (wenn mehr Kinder zu haben, die nicht gedruckt werden sollen, bis angeklickt)
  2. Alle seine Geschwister
  3. Und sein Elternteil zurück zu root parent_id=0

wird "auf ly "auf dem Bildschirm zusammen mit anderen Hauptmenüs gedruckt werden, deren parent_id 0 ist (nicht ihre Kinder).

Ich brauche folgende Ausgabe produziert werden. (Schritte).

Auf dem ersten Schritt 1:

wenn darauf geklickt wird "Hauptmenü 1":

Wenn auf "Sub Menu 1.2" geklickt hat:

, wenn darauf geklickt "Hauptmenü 3"

Wenn auf "Sub Menu 3.2"

klickte ich ?menu={$row['id']} für immer Eltern und Childes bin vorbei, kann aber nicht Figur heraus, wie man mit allen Geschwistern, Eltern und Kindern umgeht.

Ich habe versucht, $_GET['menu'] ID in Schleife mit einer separaten Funktion, die okay mit nur einer Ebene druckt, aber wenn Baum geht zweite Ebene in der Tiefe, wird seine erste Elternteil (zurück zu root) wird nicht gedruckt werden.

Ich brauche das nur in PHP nicht mit jQuery, Css (Klassen). Weil ich nicht Drucken andere Menüs auf dem Bildschirm nicht nur verstecken sie wollen.

+0

nicht sicher, warum Sie den Tag „mysql“ hinzugefügt, aber trotzdem: in der übergeordneten den vollständigen Pfad zu Ihrem Array und zum Knoten selbst (zB indem Sie zuerst eine Rekursion darauf ausführen). Zeige nur einen Knoten an (und rekursiere nur), wenn ein Knoten mit diesem Wert beginnt, beginnend mit dem Wert des ausgewählten Knotens. Wenn Sie z.B. 3.2.1, Ihr Knotenwert wäre "3.2.1" und der Elternwert wäre "3.2". Zeigen Sie nun nur Knoten an, bei denen der ausgewählte Knotenwert mit dem Parent-Wert des getesteten Knotens beginnt (z. B. ist der Parent-Pfad von 3.1 "3", "3.2.1" beginnt mit "3", also gut.) 3.1 .2 "'s Elternteil =" 3.1 "ist nicht in" 3.2.1 ") – Solarflare

+0

Ich habe ein Beispiel für ein Menü geschrieben, das wird für Kategorien verwendet. seine untergeordneten Kategorien und so weiter. Wenn ich also den vollständigen Pfad zum übergeordneten Element hinzufüge, muss ich, wenn diese Kategorie jemals gelöscht wird, auch ihren Pfad aktualisieren. Ich finde das also mit Rekursion, wenn es möglich ist, was das Problem lösen und auch diese Komplexität speichern wird. –

+0

Ja, deshalb habe ich gesagt, dass du das zuerst rekursiv machen kannst. Führen Sie es einmal aus, um Ihre Pfade zu aktualisieren (jedes Mal oder nur nach Änderungen), und führen Sie dann eine weitere Rekursion durch, um es anzuzeigen. Sie können leider nicht mit nur einer Rekursion arbeiten, wenn Sie die Rekursion verwenden wollen. Sie können natürlich eine Funktion schreiben, um zu testen, ob das übergeordnete Element des Knotens Ihren Zielknoten als Kind hat, aber dies funktioniert als Rekursion und ist langsamer (wird häufiger ausgeführt). Wenn Sie tatsächlich eine Datenbank verwenden, können Sie möglicherweise verschachtelte Sätze verwenden (sie stellen grundsätzlich den Pfad für Sie bereit), aber Geschwister können immer noch problematisch sein. – Solarflare

Antwort

0

Da Sie gesagt haben, dass Sie möchten, dass der Code in PHP statt JS Jquery sein soll. Ich habe das versucht. Es iteriert das Array dreimal, in dem es einen verschachtelten Baum erstellt hat, dh, was du brauchst.

Array $ MenuItems definiert hier und fahren Sie mit dem folgenden Code

<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

Es funktioniert zwei Ebenen richtig, wenn ich auf Submenü 1.2 klicke, zeigt es richtig Submenü 1.2.1 & Submenü 1.2.2 (mit anderen Worten Kinder von Submenü Second Level). Aber wenn ich ein anderes Level hinzufügen, d. H. Child-Menü von Submenü 1.2.2 als Untermenü 1.2.2.A. in ** $ menuItems ** '['id' => 20, 'name' => 'Untermenü 1.2.2.A', 'main' => null, 'parent_id' => 15]' (an andere Kinderebene). Es iteriert nicht nach unten, anscheinend Schleife ist dritte Ebene nach unten. Ich brauche etwas rekursiven Typ, der nicht in den unteren Ebenen gebunden ist, wenn möglich. –

+0

Für jeden, der hier ankommt; obwohl es für mich keine klare Antwort war, aber es hilft mir, mein Problem zu lösen, was ich tatsächlich tat, beschränke ich Kinder auf 5 Level und implementierte Vijay Wilsons Lösung. –

Verwandte Themen