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,
- Alle seine Kinder (wenn mehr Kinder zu haben, die nicht gedruckt werden sollen, bis angeklickt)
- Alle seine Geschwister
- 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.
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
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. –
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