PHP Rekursive Menü-Funktion
Ich habe eine sehr ähnliche situation zu diesem post
und ich brauche etwas Hilfe...
Hier ist der (teilweise) Inhalt my $menuJSONArray Variablen (beim Aufruf der Funktion):
Array
(
[0] => Array
(
[Menu_IDX] => 1
[Order] => 1
[Name] => History
[Parent] =>
[Path] => History
[Link] =>
)
[1] => Array
(
[Menu_IDX] => 2
[Order] => 25
[Name] => Review
[Parent] =>
[Path] => Review
[Link] => Review
)
[2] => Array
(
[Menu_IDX] => 3
[Order] => 35
[Name] => Past Medical History
[Parent] =>
[Path] => Past Medical History
[Link] => Past Medical History
)
[3] => Array
(
[Menu_IDX] => 4
[Order] => 45
[Name] => Item 1
[Parent] => 0
[Path] => Item 1
[Link] => Item 1
)
[4] => Array
(
[Menu_IDX] => 5
[Order] => 55
[Name] => Item 2
[Parent] => 0
[Path] => Item 2
[Link] => Item 2
)
[5] => Array
(
[Menu_IDX] => 6
[Order] => 65
[Name] => Item 3
[Parent] => 0
[Path] => Item 3
[Link] => Item 3
)
)
und so weiter...
Ich bin mit der Funktion unten, aber ich bekomme immer stecken in der Schleife das erste Element. Brauche Hilfe wrapping mein Gehirn um diese Funktion. Danke Euch allen im Voraus, diese community rockt!!
///RECURSIVE MENU
function recursive($parent, $array) {
$has_children = false; //set value of has children to false by default
foreach($array as $key => $value) { //loop through the array as key-value pairs
if ($value['Parent'] == $parent) { //if the value of Parent field is equal to parent variable
if ($has_children === false && $parent) { //if children is false but parent is not null, this is a sub item
$has_children = true; //children is true
echo '<ul>' ."\n"; //create parent menu ul
} //otherwise just create the item
echo '<li>' . "\n"; //create li for parent menu item
echo '<a href="'.$value['Path'].'">' . $value['Name'] . '</a>' . " \n"; //create link for menu item
recursive($key, $array); //create sub menu
echo "</li>\n"; //end parent menu item
}
}
if ($has_children === true && $parent) echo "</ul>\n"; //end parent menu
}
?>
<?php echo recursive(0, $menuJSONArray); ?></ul>
Was bekomme ich im Gegenzug:
<ul>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
<li>
<a href="History">History</a>
Kann nicht scheinen, um aus dieser Schleife. Danke!!
P. S. ich bin nicht mit dem Zuklappen des Baumes usw. aus der referenzierten Beitrag, wie ich werden, die den Umgang mit jquery und css. Ich kann einfach nicht erhalten die richtige Ausgabe der Menü-syntax.
- Persönlich, warum nicht einfach eine extra-Level im array zu bezeichnen, Eltern/Kind-Beziehungen:
[{"name":"Top Level","path":"/path","children":[{"name":"child","path":"/path/child"}]},{"name":"No Children","path":"/childless"}]
- Mit einer Schleife in eine rekursive Funktion kann gefährlich sein. Looping ist die Natur der Rekursion, also den Aufruf einer rekursiven Funktion innerhalb einer Schleife kann nicht liefern die Ergebnisse, die Sie erwarten. Sie sind auch mit einem
foreach
Schleife als Schlüssel/Wert-Paare zu iterieren über ein array mit numerischen Indizes, die ist problematisch, weil beim aufrufen Ihres rekursiven Funktion aus der Schleife, Sie sind nicht Inkrementieren/Veränderung der array-Schlüssel, die übergeben bekommt in dem rekursiven Aufruf, und so erhalten Sie die gleiche array-Knoten an die Funktion übergeben, so dass eine unendliche Schleife. - Widerrist: ich hatte gedacht, dieser jedoch das array Baue ich aus einer Datenbank (nicht SQL, sonst wäre dies einfach sein wird) und ich möchte verhindern, dass ein verändern der client die DB-Struktur. Vielen Dank für deinen input aber.
- Ok, das ist hilfreich. Ich denke darüber ein bisschen. Rekursion neigt zu senden, die mein Gehirn in eine Schleife! Ich hatte zuvor ein Inkrement am Ende und ich bekam das gleiche Ergebnis, so kannte ich mich gar nicht es richtig umsetzt. Erste Gedanken sind re-forming die foreach-entfernen Sie den Schlüssel-Wert -, macht es Sinn, warum das nicht geben das richtige Ergebnis da ist.
- Sie können überprüfen Sie in diesem Kommentar. stackoverflow.com/questions/23916237/...
InformationsquelleAutor FMPHPguy | 2013-10-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Stimme ich mit @Tim Withers ich beginnen, um Probleme zu lösen, von der Vorbereitung aktuelle array:
Einige Erklärungen.
Dann-Funktion erstellen Menü:
Mit diesem und mit dem richtigen array um, egal, wie tief die Kaninchen-Loch - Sie haben Ihren Baum.
Verwendung:
Natürlich... muss Es besser Weg... 😛
EDIT:
Array (ein wenig midification [nächste Kind]):
Ausgabe:
prepareMenu
Vorbereitung Ihrer ursprünglichen Arrays, um mehrdimensionale. DannbuildMenu
drucken.buildMenu
ist mehr wie pseudo-rekursive Funktion, denke ich. Sie können kopieren&einfügen mein code und verwenden Sie es mit der original-array - es wird funktionieren, aber es ist nicht optional. Ich werde die Ausgabe auf meine Antwort.Viele Details in deiner Frage, das ist großartig.
Blick auf den code, das erste Problem sehe ich mit der Zeile:
Ersten mal geben Sie die foreach-Schleife, die
$value['Parent']
istNULL
, und$parent
ist0
.Weil Sie tun, eine
==
Vergleich, dies ergibtTRUE
. Versuchen Sie stattdessen:Hinweis: die
===
. Diese überprüft auch die Daten geben und die es erfordert, zu entsprechen sowie.Die zweite Ausgabe wird dann mit der Zeile:
Den Kommentar, der deutlich macht, dass Sie möchten, um zu überprüfen, dass
$parent
ist nicht null, aber Sie nicht tun, sind Sie casting der integer-Wert von$parent
auf einen booleschen Wert, also0
werden so behandelt, alsFALSE
, und alles andere alsTRUE
.Versuchen, statt: