Malcolm Beck´s: Array in Array und Submenu

hi,

hab wieder ein halbes Problem, ich bastel mir gerade ein Tree-Menu zusammen, das je nach aufgerufener Rubrik die dazugehörigen Links aus einem array generieren soll.

Mittlerweile funzt[TM] es erfreulicher weise schon fast.

Das Problem an der Sache ist, dass ich jetzt keine einfachen Links mehr setzen kann, also, wenn Beispielsweise nur ein Link für eine bestimmte Rubrik existiert, muss das Menu trotzdem aufgeklappt werden, siehe obigen Link bei klick auf "Home".

Hier mal der Code, ich habe versucht es übersichtlich zu halten, hoffentlich ist es dass.

<?php  error_reporting('E_ALL');  
  
 $menu_child_navi_links =  array(  
    "Equipment" => array("/equipment" => array("/equipment" => "Equipment", "/equipment/tisch-ausrichten" => "Tisch ausrichten")),  
    "Scratchen" => array("/scratchen" => array("/scratchen" => "Scratchen", "/scratchen/fortgeschritten/woerter-scratch" => "Wordscratch")),  
    "Mixen" => array("/mixen" => array("/mixen" => "Mixen", "/mixen/takt-korrigieren" => "Takt korrigieren")),  
    "Home" => array("/" => array("/" => "Home")) // Wenn ich hier das zweite array leer lasse, wird der Link nicht entlinkt  
);  
 reset ($menu_child_navi_links);  
  
function entlink($mein_link_array) {  
global $MeineListeBauen;  
  
     foreach($mein_link_array as $level_key_1 => $level_value_1) {  
        foreach($level_value_1 as $level_key_2 => $level_value_2) {  
// Hauptmenu bauen  
        $haupt_menu = "<li><a href='$level_key_2'>$level_key_1</a></li>";  
// Submenu aufbauen  
               if(array_key_exists($_SERVER['REQUEST_URI'],  $level_value_2)) {  
                       $MeineListeBauen .= "<li>$level_key_1<ul>";  
                                   foreach($level_value_1[$level_key_2] as $neue_links => $link_name ) {  
                                            if($_SERVER['REQUEST_URI'] == $neue_links) {  
                                                   $MeineListeBauen .= "<li><em>$link_name</em></li>";  
                                            }  
                                            else { $MeineListeBauen .= "<li><a href='$neue_links'>$link_name</a></li>"; }  
                                           }  
                                    $MeineListeBauen .= "</ul></li>";  
                            }  
                            else { $MeineListeBauen .= $haupt_menu; }  
// Submenu ende  
                    }  
             }  
    return $MeineListeBauen;  
}  
  
  entlink($menu_child_navi_links);  
  echo "<ul>$MeineListeBauen</ul>";  
?>

Dieser Code ist so wie hier abgebildet auf dem Webspace, nur hier ohne \n und \t.

Achso, ich suche eine Lösung für das Problem mit den einfachen Links, diese sollen nicht aufklappen, nur entlinkt werden.

mfg

  1. Hallöchen,
    theoretisch müsste das funktionieren:

    ...

      
      foreach($level_value_1 as $level_key_2 => $level_value_2) {  
       // Hauptmenu bauen  
       // Start Erweiterung  
       if(count($level_value_1) == 1) {  
        $haupt_menu = "<li><em>$level_key_1</em></li>";  
        continue;  
       }  
       // Stop Erweiterung  
       $haupt_menu = "<li><a href='$level_key_2'>$level_key_1</a></li>";  
       // Submenu aufbauen  
    
    

    ...

    mfg
    vaudi

    1. hi,

      theoretisch müsste das funktionieren:

      foreach($level_value_1 as $level_key_2 => $level_value_2) {
         if(count($level_value_1) == 1) {
          $haupt_menu = "<li><em>$level_key_1</em></li>";
          continue;
         }
         $haupt_menu = "<li><a href='$level_key_2'>$level_key_1</a></li>";
         // Submenu aufbauen

        
      Nein, leider nicht, wenn auf 1 steht wird garnichts mehr angezeigt, auf 0 oder irgendeiner anderen Zahl wird das Link nicht angezeigt.  
        
      Auch das hantieren mit `is_array() oder is_string()`{:.language-php} bringt nichts, ich werd wohl das array um einen Punkt erweitern, wo ich dann bestimme, was Parent und was nicht ist.  
        
      Oder gibt es noch andere Ideen?  
        
      mfg  
      
      -- 
      [I have a Dream...](http://www.myvideo.de/watch/2503116/I_have_a_dream_Will_I_AM_feat_Common)  
      
      
      1. hi,

        theoretisch müsste das funktionieren:

        foreach($level_value_1 as $level_key_2 => $level_value_2) {
           if(count($level_value_1) == 1) {
            $haupt_menu = "<li><em>$level_key_1</em></li>";
            continue;
           }
           $haupt_menu = "<li><a href='$level_key_2'>$level_key_1</a></li>";
           // Submenu aufbauen

        
        >   
        > Nein, leider nicht, wenn auf 1 steht wird garnichts mehr angezeigt, auf 0 oder irgendeiner anderen Zahl wird das Link nicht angezeigt.  
        >   
        > Auch das hantieren mit `is_array() oder is_string()`{:.language-php} bringt nichts, ich werd wohl das array um einen Punkt erweitern, wo ich dann bestimme, was Parent und was nicht ist.  
        >   
        > Oder gibt es noch andere Ideen?  
        >   
        > mfg  
        >   
          
        ups, da hab ich wohl was übersehen:  
        $haupt\_menu wird ja erst später an $MeineListeBauen zugewiesen, bzw. durch das continue gar nicht.  
        Korrigiere doch mal die Zuweisung:  
          
        ~~~php
          
            if(count($level_value_1) == 1) {  
        //     $haupt_menu = "<li><em>$level_key_1</em></li>";     // falsch  
             $MeineListeBauen .= "<li><em>$level_key_1</em></li>"; // richtig  
             continue;  
            }  
        
        
        1. hi,

          $haupt_menu wird ja erst später an $MeineListeBauen zugewiesen, bzw. durch das continue gar nicht.
          Korrigiere doch mal die Zuweisung:

          Nein, das hat auch nicht funktioniert, ich werde erstmal probieren, über das array festzulegen, ob es unterlinks gibt, also das array erweitern.

          Danke trotzdem für die hilfe.

          mfg

  2. Tach.

    Das Problem an der Sache ist, dass ich jetzt keine einfachen Links mehr setzen kann, also, wenn Beispielsweise nur ein Link für eine bestimmte Rubrik existiert, muss das Menu trotzdem aufgeklappt werden, siehe obigen Link bei klick auf "Home".

    Hier mal der Code, ich habe versucht es übersichtlich zu halten, hoffentlich ist es dass.

    Nein, um ehrlich zu sein. Vielleicht beschreibst Du einfach nochmal in Worten, was genau Du erreichen möchtest und was davon nicht funktioniert. Das wäre hilfreicher, als sich das vermutlich gewünschte Verhalten aus Code herzuleiten, der nicht das macht, was er soll ... Ich habe z. B. keine Ahnung, was "entlinken" sein soll.

    Auf Deiner Testseite erscheint als erster Unterpunkt eines Links immer ein Eintrag mit gleichem Namen und ohne Link. Das soll so sein? Soll das Navigationsmenü beliebig tief verschachtelt werden können?

    --
    Once is a mistake, twice is Jazz.
    1. hi,

      Ich habe z. B. keine Ahnung, was "entlinken" sein soll.

      Es geht um ein Ausklappmenu, entlinken in diesem zusammenhang bedeutet, dass der Link der aktuell angezeigten Seite kein Link mehr sein soll.
      Habe es gerade selbst hinbekommen, aber Suboptimal.

      Auf Deiner Testseite erscheint als erster Unterpunkt eines Links immer ein Eintrag mit gleichem Namen und ohne Link. Das soll so sein?

      Ja, das ist so beabsichtigt, dass stellt "Quasi" den Index der gewählten Rubrik dar, aber anders kriege ich es auch nicht zum ausklappen.

      Soll das Navigationsmenü beliebig tief verschachtelt werden können?

      Das wäre natürlich der Idealfall, ich habe es jetzt so hinbekommen, das ich auf Maximal eine unterebene komme, besser wäre eine beliebig tiefe verschachtelung.

      Der jetzige stand der dinge ist http://start-navi.de/.

      50 Zeilen verantwortlicher Code:
      (Neues Ziel ist eine unendlich tiefe verschachtelung, lohnt es, auf diesen Code aufzubauen oder besser neu anfangen?)

      <?php  error_reporting('E_ALL');  
        
       $menu_child_navi_links =  array(  
        
      "Home" => array("/" => array(  
      )),  
      "Equipment" => array("/equipment" => array(  
      "/equipment" => "Equipment", "/equipment/einstellungen" => "Justage", "/equipment/insider-tipps" => "Tipps und Tricks","/equipment/tisch-ausrichten" => "Tisch ausrichten"  
      )),  
      "Scratchen" => array("/scratchen" => array(  
      "/scratchen" => "Scratchen", "/scratchen/fortgeschritten/woerter-scratch" => "Wordscratch"  
      )),  
      "beatjuggle" => array("/beatjuggling" => array(  
      )),  
      "Mixen" => array("/mixen" => array(  
      "/mixen" => "Mixen", "/mixen/takt-korrigieren" => "Takt korrigieren"  
      ))  
        
      ); reset ($menu_child_navi_links);  
        
      function entlink($mein_link_array) {  
      global $MeineListeBauen;  
        
           foreach($mein_link_array as $level_key_1 => $level_value_1) {  
              foreach($level_value_1 as $level_key_2 => $level_value_2) {  
        
       if($_SERVER['REQUEST_URI'] == $level_key_2) {  
        $haupt_menu = "<li><em>$level_key_1</em></li>";  
       } else {  
        $haupt_menu = "<li><a href='$level_key_2'>$level_key_1</a></li>";  
       }  
                     if(array_key_exists($_SERVER['REQUEST_URI'],  $level_value_2)) {  
                             $MeineListeBauen .= "<li>$level_key_1<ul>";  
                                         foreach($level_value_1[$level_key_2] as $neue_links => $link_name ) {  
                                                  if($_SERVER['REQUEST_URI'] == $neue_links) {  
                                                         $MeineListeBauen .= "<li><em>$link_name</em></li>";  
                                                  }  
                                                  else { $MeineListeBauen .= "<li><a href='$neue_links'>$link_name</a></li>"; }  
                                                 }  
                                          $MeineListeBauen .= "</ul></li>";  
                                  }  
                                  else { $MeineListeBauen .= $haupt_menu; }  
                          }  
                   }  
          return $MeineListeBauen;  
      }  
        
        entlink($menu_child_navi_links);  
        echo "<ul>$MeineListeBauen</ul>";  
      ?>
      

      mfg

      1. Tach.

        50 Zeilen verantwortlicher Code:
        (Neues Ziel ist eine unendlich tiefe verschachtelung, lohnt es, auf diesen Code aufzubauen oder besser neu anfangen?)

        Du mußt bloß unendlich viele dieser foreaches ineinander schachteln. ;)

        Momentan hast Du ziemlich viele redundaten Informationen in Deiner Navigationsstruktur. Ich glaube, Dein gesamtes Vorhaben wird einfacher, wenn die die Pfade zu den einzelnen Einträgen genau dem Weg durch den Navigationsbaum entsprechen:

        /
            home/
            equipment/
                einstellungen/
                insider-tips/
            beatjuggling/

        Die insider-tips sind also unter "/equipment/insider-tips/" zu erreichen. Jeder Eintrag weiß dann nur noch, wie er selber heißt und welche Kinder er hat.

        [
            {
                "title"    => "Home",
                "path"     => "home",
                "children" => []
            }
            ,{
                "title"    => "Equipment",
                "path"     => "equipment",
                "children" => [
                    {
                        "title"    => "Justage",
                        "path"     => "einstellungen",
                        "children" => []
                    }
                    ,{
                        "title"    => "Tips und Tricks",
                        "path"     => "insider-tips",
                        "children" => []
                    }
                ]
            }
            ,{
                "title"    => "Beat Juggle",
                "path"     => "beatjuggling",
                "children" => []
            }
        ]

        Oder so ähnlich. :)

        Du kannst den Pfad aus $_SERVER["REQUEST_URI"] stückweise von links nach rechts abarbeiten und für jedes "Verzeichnis" eine Ebene tiefer in Deinem Navigationsbaum absteigen, falls der Verzeichnisname an der aktuellen Stelle im Pfad steht. Ansonsten werden einfach alle Einträge der momentanen Ebene in die Ausgabeliste übernommen. Genau das gleiche Spiel dann im Unterverzeichnis (Rekursion), bis das Ende des Pfades erreicht wurde oder der Navigationsbaum nicht mehr damit übereinstimmt. Falls das Pfadende erreicht wurde und das aktuelle Verzeichnis Unterverzeichnisse hat, machst Du noch einen Schritt tiefer, um diese Kinder ebenfalls in Deine Ausgabeliste aufzunehmen.

        Das alles erpart Dir auch den gedoppelten "Index der gewählten Rubrik", den Du bisher zum Ausklappen verwendest. Und wenn's keine Kinder gibt, wird nichts ausgeklappt – das war ja das ursprüngliche Problem, wenn ich's richtig verstanden habe.

        --
        Once is a mistake, twice is Jazz.
        1. hi,

          Du mußt bloß unendlich viele dieser foreaches ineinander schachteln. ;)

          Das hatte ich mir schon fast gedacht :) und hatte es kurz darauf rekursiv gelöst, leider habe ich es an den falschen Thread gehangen (wenn ich dies zum laufen kriegen würde wäre es schon Perfekt).

          Momentan hast Du ziemlich viele redundaten Informationen in Deiner Navigationsstruktur.

          Stimmt, in der vorletzten Version hatte ich es so gelöst, um an die einzelnen Links ranzukommen, ich lerne gerade erst mit verschachtelten arrays zu arbeiten.

          Die insider-tips sind also unter "/equipment/insider-tips/" zu erreichen. Jeder Eintrag weiß dann nur noch, wie er selber heißt und welche Kinder er hat.

          Ich sehe schon, ich habe wahrscheinlich einen wichtigen Punkt ausgelassen, ich habe überhaupt keine Verzeichnisse, jeder Aufruf erfolgt über die index.php, ich schreibe es dann per mod_rewrite um, die Inhalte kommen dann aus der Datenbank, hier schon im Einsatz (allerdings ist die Navifunktion der Seite mehrere 100 Zeilen groß und mehr als schlecht zu warten).

          [
              {
                  "title"    => "Home",
                  "path"     => "home",
                  "children" => []
              }
              ,{
                  "title"    => "Equipment",
                  "path"     => "equipment",
                  "children" => [
                      {
                          "title"    => "Justage",
                          "path"     => "einstellungen",
                          "children" => []
                      }
                      ,{
                          "title"    => "Tips und Tricks",
                          "path"     => "insider-tips",
                          "children" => []
                      }
                  ]
              }
              ,{
                  "title"    => "Beat Juggle",
                  "path"     => "beatjuggling",
                  "children" => []
              }
          ]
          Oder so ähnlich. :)

          Das sieht sehr übersichtlich aus, das werde ich mal probieren umzusetzen, mein grösstes Problem ist, die array richtig auszulesen und damit zu arbeiten, das habe ich wohl noch nicht so recht verstanden.

          Du kannst den Pfad aus $_SERVER["REQUEST_URI"] stückweise von links nach rechts abarbeiten und für jedes "Verzeichnis" eine Ebene tiefer in Deinem Navigationsbaum absteigen, falls der Verzeichnisname an der aktuellen Stelle im Pfad steht. Ansonsten werden einfach alle Einträge der momentanen Ebene in die Ausgabeliste übernommen.

          Das ist wie gesagt garnicht nötig, ich will nur die arrays abarbeiten, die Werte für das array kommen dann aus der DB.

          Das alles erpart Dir auch den gedoppelten "Index der gewählten Rubrik", den Du bisher zum Ausklappen verwendest. Und wenn's keine Kinder gibt, wird nichts ausgeklappt – das war ja das ursprüngliche Problem, wenn ich's richtig verstanden habe.

          So ähnlich habe ich es in der jetzigen Version, nur dieses Menu will nicht aufgeklappt bleiben, ich denke, es ist ne Kleinigkeit, ich sehe es nur nicht.

          mfg

          1. Tach.

            Die insider-tips sind also unter "/equipment/insider-tips/" zu erreichen. Jeder Eintrag weiß dann nur noch, wie er selber heißt und welche Kinder er hat.

            Ich sehe schon, ich habe wahrscheinlich einen wichtigen Punkt ausgelassen, ich habe überhaupt keine Verzeichnisse, jeder Aufruf erfolgt über die index.php, ich schreibe es dann per mod_rewrite um

            Das ist mir nicht entgangen. Als ich von "Verzeichnissen" sprach, meinte ich die Einträge im Array (dem Navigationsbaum), da die ja im Prinzip wie verschachtelte Verzeichnisse aufgebaut sind.

            die Inhalte kommen dann aus der Datenbank

            Und die Seitenstruktur (also das, was Du für die Navigationsliste benutzt) auch oder hast Du die separat z. B. als solche verschachtelten Arrays? Für Baumstrukturen in einem RDBS eignen sich Nested Sets ganz hervorragend. Falls diese Daten eh in der DB stecken, wäre das vielleicht die bessere Alternative.

            --
            Once is a mistake, twice is Jazz.
            1. hi,

              Das ist mir nicht entgangen. Als ich von "Verzeichnissen" sprach, meinte ich die Einträge im Array (dem Navigationsbaum), da die ja im Prinzip wie verschachtelte Verzeichnisse aufgebaut sind.

              Hätte mich auch gewundert, wenn doch :) Entschuldige meine Unterschätzung.

              Und die Seitenstruktur (also das, was Du für die Navigationsliste benutzt) auch oder hast Du die separat z. B. als solche verschachtelten Arrays? Für Baumstrukturen in einem RDBS eignen sich Nested Sets ganz hervorragend. Falls diese Daten eh in der DB stecken, wäre das vielleicht die bessere Alternative.

              Ich arbeite mit MySQL 5.0, Lokal und auch auf dem Webserver.
              Die Daten für das array kommen zurzeit teilweise aus der DB, teilweise sind sie Hart kodiert in der Navifunktion, kurz, ein einziges Chaos.

              Wenn es fertig ist, soll alles über die DB laufen, Klassisches CMS, dafür habe ich eine Tabelle mit 5 Feldern angelegt, wo ich die Struktur, Linknamen und Linkziele angebe (das Management der Daten habe ich auch schon ganz gut gelöst, nur diese Navigation macht mich seit 2 Monaten fertig).

              Nested sets habe ich auch schon Probiert umzusetzen, zweimal, Erfolglos. Da blick ich irgendwie überhaupt nicht durch.

              Zumal ich nicht mal weiß, ob Nested Sets das machen, was ich möchte, also die Menupunkte nur aufklappen, wenn benötigt.
              Es gibt zwar ein zwei Tutorials dazu (beide gleich), aber das endgültige Ergebnis wird nicht gezeigt.

              mfg

              1. Tach.

                Nested sets habe ich auch schon Probiert umzusetzen, zweimal, Erfolglos. Da blick ich irgendwie überhaupt nicht durch.

                Zumal ich nicht mal weiß, ob Nested Sets das machen, was ich möchte, also die Menupunkte nur aufklappen, wenn benötigt.

                Den HTML-Code erzeugen Dir Nested Sets natürlich nicht. Aber Du kannst die Datenbank schon so abfragen, daß Du nur die Navigationseinträge bekommst, die Du tatsächlich anzeigen willst. Vielleicht schaust Du's Dir doch nochmal an. ;)

                Wenn die Seitenstruktur letztendlich eh komplett in der Datenbank stehen soll, ist es etwas umständlich, aus den abgefragten Daten (und das sind immer *alle* Navigationseinträge) Deine verschachtelte Arraystruktur zu bauen und erst dann abzugrasen, was davon Du wirklich benötigst. Naja, wie auch immer ... Ich hab hier eine Funktion geschrieben, die aus einem solchen beliebig tief verschachtelten Array die Navigations erstellt. Der Pfad der aktuellen Seite kommt aus $_SERVER["REQUEST_URI"]. Das Teil ist an manchen Stellen noch verbesserungsbedürftig (u. a. kontextabhängiges Escapen!) und kann auch eleganter geschrieben werden, aber zur Veranschaulichung des Grundprinzips sollte es reichen.

                  
                <?php  
                  
                // Baumstruktur der Seite  
                $navTree = array(  
                    array(  
                        "title"    => "Home",  
                        "path"     => "",  
                        "children" => array()  
                    )  
                    ,array(  
                        "title"    => "Equipment",  
                        "path"     => "equipment",  
                        "children" => array(  
                            array(  
                                "title"    => "Einstellungen",  
                                "path"     => "einstellungen",  
                                "children" => array()  
                            )  
                            ,array(  
                                "title"    => "Tips und Tricks",  
                                "path"     => "insider-tips",  
                                "children" => array(  
                                    array(  
                                        "title"    => "Noch mehr Zeug",  
                                        "path"     => "zeug",  
                                        "children" => array()  
                                    )  
                                )  
                            )  
                            ,array(  
                                "title"    => "Tisch ausrichten",  
                                "path"     => "tisch-ausrichten",  
                                "children" => array()  
                            )  
                        )  
                    )  
                    ,array(  
                        "title"    => "Beat Juggle",  
                        "path"     => "beatjuggling",  
                        "children" => array(  
                        )  
                    )  
                );  
                  
                  
                $requestURI = $_SERVER["REQUEST_URI"];  
                  
                // Slashes am Anfang und Ende des Pfades entfernen  
                $matches = array();  
                if (preg_match("~^/*(.*?)/*$~", $requestURI, $matches)) {  
                    $requestURI = $matches[1];  
                }  
                  
                // Pfad in einzelne Verzeichnisse aufspalten  
                $requestParts = explode("/", $requestURI);  
                  
                //header("Content-Type: text/plain");  
                //echo "Request-URI: $requestURI\n";  
                //print_r($requestParts, true);  
                  
                echo getHTMLList($navTree, $requestParts);  
                  
                  
                  
                function getHTMLList ($navTree, $requestParts, $partIndex = 0) {  
                    $sList = "";  
                    $parentPath = implode("/", array_slice($requestParts, 0, $partIndex));  
                    $maxPartIndex = sizeof($requestParts) - 1;  
                  
                    foreach ($navTree as $node) {  
                        $sChildList = "";  
                        if ($partIndex <= $maxPartIndex) {  
                            // Falls der aktueller Knotenname im gegebenen Pfad enthalten ist,  
                            // werden auch sein Kinder (eine Ebene tiefer) besucht.  
                            if ($requestParts[$partIndex] == $node["path"]) {  
                                if (!empty($node["children"])) {  
                                    $sChildList = getHTMLList($node["children"], $requestParts, $partIndex+1);  
                                }  
                            }  
                        }  
                  
                        // HTML-Liste aus aktuellem Knoten und dessen Kindern erzeugen.  
                        // Der aktuelle Knoten (letzter Eintrag im Pfad) wird nicht verlinkt.  
                        if (($partIndex == $maxPartIndex) && ($requestParts[$partIndex] == $node["path"])) {  
                            $sList .= sprintf('<li>%s%s</li>',  
                                    $node["title"], $sChildList);  
                        } else {  
                            $sList .= sprintf('<li><a href="/%s%s">%s</a>%s</li>',  
                                    $parentPath . (($parentPath != "") ? "/" : ""),  
                                    $node["path"],  
                                    $node["title"],  
                                    $sChildList);  
                        }  
                    }  
                    return "<ul>$sList</ul>";  
                }  
                  
                ?>  
                
                
                --
                Once is a mistake, twice is Jazz.
                1. hi,

                  vorneweg, vielen Dank! Du hast mich vor dem totalen Absturz gerettet :)
                  Ich war schon drauf und dran, die Navigation aufzugeben, ich hatte schon Albträume.

                  Den HTML-Code erzeugen Dir Nested Sets natürlich nicht. Aber Du kannst die Datenbank schon so abfragen, daß Du nur die Navigationseinträge bekommst, die Du tatsächlich anzeigen willst. Vielleicht schaust Du's Dir doch nochmal an. ;)

                  Ja, lernen muss/will ich es definitiv, ich möchte irgendwann mein CMS auch wirklich als vollständiges CMS laufen lassen, und nicht so halbe sachen wie jetzt :)
                  Aber vorerst reicht mir so eine rekursive Lösung.

                  Wenn die Seitenstruktur letztendlich eh komplett in der Datenbank stehen » soll, ist es etwas umständlich, aus den abgefragten Daten (und das sind immer *alle* Navigationseinträge) Deine verschachtelte Arraystruktur zu bauen und erst dann abzugrasen, was davon Du wirklich benötigst.

                  Das ist wohl Wahr, ich hatte mir dass viel zu einfach vorgestellt, ein "normales" array, also nur eine Ebene, ist kein Problem, aber ein so tief verschachteltes krieg ich irgendwie nicht hin.
                  Ist aber auch nicht so schlimm, jetzt trage ich neue Links gerne ins array :)
                  Meine derzeit auf dem Server laufende Navigation ist allein in der Hauptfunktion 240 Zeilen lang und Katastrophal, von neuen Rubriken/Themen einfügen will ich erst garnicht anfangen.
                  Ich weiss garnicht, wie oft ich abfrage, ob bestimmte array_keys existieren, um überhaupt auf der Seite etwas anzuzeigen (6 oder 7 mal).

                  Ich hab hier eine Funktion geschrieben, die aus einem solchen beliebig tief verschachtelten Array die Navigations erstellt. Der Pfad der aktuellen Seite kommt aus $_SERVER["REQUEST_URI"].

                  Darf ich fragen, wie lang du dafür gebraucht hast? Ich versuche es schon seit Wochen ohne Erfolg.

                  Das Teil ist an manchen Stellen noch verbesserungsbedürftig (u. a. kontextabhängiges Escapen!) und kann auch eleganter geschrieben werden, aber zur Veranschaulichung des Grundprinzips sollte es reichen.

                  Ja, das habe ich gemerkt :) Ich brauchte einderthalb Stunden, um rauszukriegen, wie ich der Liste _eine_ id und die Childs in ein <ul> bekomme, habe es hinbekommen :)

                  Aber mit dem Escapen, da blick ich nicht durch, wo muss escaped werden?
                  Es findet ja so keine Ein- oder Ausgabe statt.

                  Jedenfalls vielen vielen Dank, jetzt kann ich mich endlich wieder auf _irgendwas_ konzentrieren :)

                  mfg

                  1. Tach.

                    Ich hab hier eine Funktion geschrieben, die aus einem solchen beliebig tief verschachtelten Array die Navigations erstellt. Der Pfad der aktuellen Seite kommt aus $_SERVER["REQUEST_URI"].

                    Darf ich fragen, wie lang du dafür gebraucht hast? Ich versuche es schon seit Wochen ohne Erfolg.

                    Hmm, ich hab dabei nicht auf die Uhr gekuckt, aber besonders viel Zeit hab nicht reingesteckt. Sollte halt nur ein kleines Beispiel sein.

                    Aber mit dem Escapen, da blick ich nicht durch, wo muss escaped werden?
                    Es findet ja so keine Ein- oder Ausgabe statt.

                    Falls Du "Verzeichnisnamen" und Titel mit Zeichen, die so nicht in URLs bzw. HTML vorkommen dürfen, vergibst, mußt Du das berücksichtigen. Nehmen wir mal an, Du hättest gerne einen Eintrag "Icke & Er", der unter einer URL erreichbar sein soll, die der Einfachheit halber direkt aus dem Titel generiert wird¹. Für die HTML-Ausgabe der Titel bedeutet das htmlspecialchars(), für die HREFs der Links rawurlencode() und für die eingehende Request-URI rawurldecode().

                    --

                    ¹ In diesem Fall wären natürlich auch ausgefeiltere Mechanismen denkbar. Anstatt icke%20%26%20er könnte daraus z. B. icke-und-er werden. Das sieht dann vielleicht auch ansprechender aus und ist leichter zu merken.

                    --
                    Once is a mistake, twice is Jazz.
                    1. hi,

                      Hmm, ich hab dabei nicht auf die Uhr gekuckt, aber besonders viel Zeit hab nicht reingesteckt. Sollte halt nur ein kleines Beispiel sein.

                      Für ein kleines Beispiel ist gut, ich versteh nicht mal 1/10 von dem Code :)

                      Für die HTML-Ausgabe der Titel bedeutet das htmlspecialchars(), für die HREFs der Links rawurlencode() und für die eingehende Request-URI rawurldecode().

                      Ok, jetzt ist es verständlich. Ich hatte nach deinem ersten Hinweis schon versucht, die Request-URI zu encoden, war aber in die falsche richtung geschossen, rawurldecode() kannte ich noch nicht.

                      Ich hab mich jetzt auch doch dazu durchgerungen, es nochmal SELF zu probieren, ich kann es einfach nicht lassen :)

                      Dein Script kommt aber in meine Script-Bibliothek, und, <hellseh>spätestens in drei Tagen werde ich wieder drauf zurückgreifen</hellseh>.

                      Vielen Dank für deine Hilfe.

                      mfg

                      1. Tach.

                        Hmm, ich hab dabei nicht auf die Uhr gekuckt, aber besonders viel Zeit hab nicht reingesteckt. Sollte halt nur ein kleines Beispiel sein.

                        Für ein kleines Beispiel ist gut, ich versteh nicht mal 1/10 von dem Code :)

                        Hmm, das spricht natürlich nicht gerade für die Verständlichkeit des Codes. Besonders ausführlich kommentiert ist er ja auch nicht ... Hast Du irgendwelche bestimmten Fragen oder ist das Teil in seiner Gesamtheit einfach zu undurchsichtig?

                        --
                        Once is a mistake, twice is Jazz.
                        1. hi,

                          Hmm, das spricht natürlich nicht gerade für die Verständlichkeit des Codes. Besonders ausführlich kommentiert ist er ja auch nicht ... Hast Du irgendwelche bestimmten Fragen oder ist das Teil in seiner Gesamtheit einfach zu undurchsichtig?

                          Du solltest meine Fähigkeiten hier nicht überschätzen, ich befasse mich erst seit ein Paar Monaten mit der Materie Programmieren.

                          Das Unverständnis beginnt dort, wo du die Pfade auseinanderpflückst, ab da kann ich schon nicht mehr folgen.
                          Das liegt aber daran, dass ich die meisten Funktionen und Befehle noch nicht kenne.

                          Wie kann man das Menu dazu bewegen, immer Offen zu bleiben, sobald Childs in der Obersten Rubrik auftauchen?

                          Scratchen
                                   Beginner
                             Link1
                             Link2
                                   Fortgeschritten
                             Link1
                             Link2
                             Link2

                          Ich steig da nicht durch.

                          mfg

                          1. Tach.

                            Wie kann man das Menu dazu bewegen, immer Offen zu bleiben, sobald Childs in der Obersten Rubrik auftauchen?

                            Hmm? Geht es jetzt um ein zusätzliches Feature oder die Erklärung dessen, was das Skript schon macht?

                            --
                            Once is a mistake, twice is Jazz.
                            1. hi,

                              Wie kann man das Menu dazu bewegen, immer Offen zu bleiben, sobald Childs in der Obersten Rubrik auftauchen?

                              Hmm? Geht es jetzt um ein zusätzliches Feature oder die Erklärung dessen, was das Skript schon macht?

                              Es wäre ein neues Feature, wobei eine Erklärung, wenn es nicht zu Komplex ist, von Vorteil wäre, so könnte ich neue Features selber bauen.

                              Eine Grundsätzliche Frage hätte ich da noch, wie nennt sich diese art der Programmierung, ist das Objekt Orientiert?

                              mfg

                              1. hi,

                                ich wieder, und ich habe es fast geschafft :)
                                An sich ist es geschafft, auf 2 Ebenen kann das Menu schon ausklappen, alle benötigten Daten kommen aus der Datenbank und das entlinken funktioniert auch.

                                Nachteil, (aber nicht schlimm), ich benötige 3 SELECT, um an die Daten aus der Datenbank zu kommen, dafür komme ich mit weniger als 100 Zeilen Code aus.

                                Mal sehen, ob ich die letzte Hürde auch noch pack, wenn es Fertig ist, soll dass Menu Exakt so funktionieren, wie es hier schon der Fall ist.

                                Morgen lade ich das ganze mal zum testen hoch, dann kann ich es hier verlinken.

                                mfg

    2. hi,

      Nein, um ehrlich zu sein. Vielleicht beschreibst Du einfach nochmal in Worten, was genau Du erreichen möchtest und was davon nicht funktioniert.

      Ok, ein letzter Versuch, vielleicht('hoffentlich') klappt es ja jetzt.

      Wenn man jetzt auf die Seite start-navi.de/scratchen kommt, sieht man das ausgeklappte Menu, ist auch soweit richtig.

      Jetzt habe ich das Problem, das bei klick auf eines der ausgeklappten Links das Ausklapp-Menu verschwindet, ich kenne zwar die Ursache, komme aber nicht auf die Lösung.
      Mir fehlt eine Spezielle Bedingung, die dem Menu sagt, dass es aufgeklappt bleiben soll, ich komm aber nicht drauf, was das sein kann.

      Hier mal der neue Code: (kommentiert)

      <?php  error_reporting('E_ALL');  
        
      $menu_child_navi_links =  array(  
      array("text" => "Home", "ziel" => "/"),  
      array("text" => "Equipment", "ziel" => "/equipment"),  
        
       array("text" => "Scratchen", "ziel" => "/scratchen", "sub" =>  
        array(  
         array("text" => "Scratchen", "ziel" => "/scratchen"),  
         array("text" =>  "Justage", "ziel" => "/equipment/einstellungen"),  
         array("text" =>  "Mixen", "ziel" => "/mixen"))  
      )  
      ); reset ($menu_child_navi_links);  
        
      function entlink($mein_link_array) {  
       $MeinMenu = "<ul>\n";  
        
       foreach($mein_link_array as $ebene_1) {  /* Array durchgehen */  
        
        if($_SERVER['REQUEST_URI'] == $ebene_1["ziel"])  
         $MeinMenu .= "<li><em>".$ebene_1["text"]."</em>"; /* Hier wird der Link der angezeigten Seite "entlinkt" */  
        else   $MeinMenu .= "<li><a href=\"".$ebene_1["ziel"]."\">".$ebene_1["text"]."</a>";   /* alle anderen werden "verlinkt" */  
        
        /* hier muss die bedingung rein, damit das Menu ausgeklappt bleibt, wenn es zu einer bestimmten Rubrik gehört */  
         if (($_SERVER['REQUEST_URI'] == $ebene_1["ziel"]) AND (isset($ebene_1["sub"]))) {  
          $MeinMenu .= entlink($ebene_1["sub"]);  
         }  
        
        $MeinMenu .= "</li>\n";  
       }  
          $MeinMenu .= "</ul>\n";  
        return $MeinMenu;  
      }  
        
      echo  entlink($menu_child_navi_links);  
      ?>
      

      Die zweite if Anweisung ist das eigentlich Relevante, da muss die Bedingung rein, die dafür sorgt, dass das Menu aufgeklappt bleiben soll, ich komm aber nicht drauf, wie ich das anstellen kann.

      Sorry wenn ich unmissverständlich bin, ich weiß nicht, wie ich es besser erklären soll.

      mfg