PHP Rekursive Menü-Funktion

Ich habe eine sehr ähnliche situation zu diesem post

PHP: verschachtelte Menü mit einer rekursiven Funktion, die Erweiterung nur einige Knoten (nicht den ganzen Baum)

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