Rekursives Auslesen der Kategorien aus DB

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rekursives Auslesen der Kategorien aus DB

    Folgende Funktionen werden aufgerufen mit:

    PHP-Code:
    <?=kats_form($kat_bereich,$kat)?>
    Es werden die Kategorien für $kat_bereich ausgelesen und als Auswahlliset ausgegeben.
    (Die Beschränkung auf $kat_bereich ist für das aktuelle Problem unwichtig und muss nicht beachtet werden.)

    Frage: Geht das auch einfacher. V.a. ohne global

    Ich möchte keine direkte Ausgabe mit echo() und mit return-Werten kommt nur Käse heraus..

    PHP-Code:
    function kats_form($kat_bereich,$kat_selected) {
        global 
    $kats_form_unterkats_content;
        
    $form '<select name="kat">';
        
    $form.= '<option value="">[ Kategorie wählen ]</option>';
        
    kats_form_unterkats(0,$kat_bereich,$kat_selected);
        
    $form.= $kats_form_unterkats_content;
        
    $form.= '</select>';
        return 
    $form;
    }

    function 
    kats_form_unterkats($kat_darueber,$kat_bereich,$kat_selected,$kats_form_unterkats_content="",$prae="") {
        global 
    $kats_form_unterkats_content;
        
    $query mysql_query("SELECT name,id FROM tab_kats WHERE 
            kat_darueber = "
    .$kat_darueber." AND bereich = ".$kat_bereich);
        if (
    mysql_num_rows($query)) {
            while (
    $row mysql_fetch_object($query)) {
                
    $kats_form_unterkats_content.= "<option value=\"".$row->id."\"";
                if (
    $row->id == $kat_selected) {
                    
    $kats_form_unterkats_content.= " selected class=\"selected\"";
                }
                
    $kats_form_unterkats_content.= ">".$prae." ".$row->name."</option>";
                
    $prae.= "- ";
                
    kats_form_unterkats($row->id,$kat_bereich,$kat_selected,$content,$prae);
                
    $prae substr($prae,2);
            }
        }

    Gruß,
    Syco
    [COLOR=darkblue].: 1+1=23 :.[/COLOR]

  • #2
    Darf man fragen was für ein Käse da rauskommt?
    gruss Chris

    [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

    Kommentar


    • #3
      ehm


      return $kats_form_unterkats_content; in die Unterkat Funktion und das Ergebniss zurückgeben....

      form. = unterkatfunktion();
      Zuletzt geändert von prego; 08.08.2005, 09:11.

      Kommentar


      • #4
        Das Problem ist, dass die zweite Funktion Rekursiv, also mehrmals aufgerufen wird. Es werden aber nur die Werte des ersten Aufrufs zurückgegeben, sprich ich habe nur eine Liste der Kategorien der obersten Hierarchie ohne Unterkats.

        Hier der Code mit return

        PHP-Code:
        function kats_form($kat_bereich,$kat_selected) {
            
        //global $kats_form_unterkats_content;
            
        $form '<select name="kat">';
            
        $form.= '<option value="">[ Kategorie wählen ]</option>';
            
        $form.= kats_form_kats(0,$kat_bereich,$kat_selected);
            
        //$form.= $kats_form_unterkats_content;
            
        $form.= '</select>';
            return 
        $form;
        }

        function 
        kats_form_kats($kat_darueber,$kat_bereich,$kat_selected,$kats_form_unterkats_content="",$prae="") {
            
        //global $kats_form_unterkats_content;
            
        $query mysql_query("SELECT name,id FROM tab_kats WHERE 
                kat_darueber = "
        .$kat_darueber." AND bereich = ".$kat_bereich);
            if (
        mysql_num_rows($query)) {
                while (
        $row mysql_fetch_object($query)) {
                    
        $kats_form_unterkats_content.= "<option value=\"".$row->id."\"";
                    if (
        $row->id == $kat_selected) {
                        
        $kats_form_unterkats_content.= " selected class=\"selected\"";
                    }
                    
        $kats_form_unterkats_content.= ">".$prae." ".$row->name."</option>";
                    
        $prae.= "- ";
                    
        kats_form_kats($row->id,$kat_bereich,$kat_selected,$content,$prae);
                    
        $prae substr($prae,2);
                }
            }
            return (
        $kats_form_unterkats_content);

        [COLOR=darkblue].: 1+1=23 :.[/COLOR]

        Kommentar


        • #5
          Ok, ich geb zu, ich hab es ein wenig kompliziert ausgedrückt.

          Aber schau doch bitte mal im Manual unter "return" nach...

          Und wenn du die Funktion ausführst, solltest du ihr Rückgabeergebniss auch irgendwo reinschreiben und wiederum zurück geben...

          PHP-Code:
          kats_form_kats($row->id,$kat_bereich,$kat_selected,$content,$prae); 

          Kommentar


          • #6
            Ich kann dir nicht ganz folgen. Liegt aber wahrscheinlich am mir bzw. meinem Schlafmangel. Ich sitze jetzt schon seit 2 h an einer Rekursiven Funktion, die auch nicht schwerer sein sollte als die obige.

            Was ich mir nicht erklären kann ist wie diese Zeile da reinkommt:

            PHP-Code:
            kats_form_kats($row->id,$kat_bereich,$kat_selected,$content,$prae); 
            -> sollte eigentlich so heißen:

            PHP-Code:
            kats_form_kats($row->id,$kat_bereich,$kat_selected,$kats_form_unterkats_content,$prae); 
            .. so hab ichs auch gespeichert.
            [COLOR=darkblue].: 1+1=23 :.[/COLOR]

            Kommentar


            • #7
              also ich hab sowas erst vor kurzem selbst gemacht. ich persönlich habe es so gelöst

              ich hab in der tabelle für kategorieen eine spalte PreviousCat angelegt und dort die id der vorgänger kategorie abgelegt. die oberste kategorie hat den wert -1

              die rekursive funktion hat sich dann solange selbst aufgerufen bis der wert -1 war. die arrayliste mit den vorangegangen ergebnissen hab ich dann als parameter mitgegeben.

              Kommentar


              • #8
                die rekursive funktion hat sich dann solange selbst aufgerufen bis der wert -1 war. die arrayliste mit den vorangegangen ergebnissen hab ich dann als parameter mitgegeben.
                typische Vorgehensweise für die Erstellung von Breadcrumbs. Dafür reicht aber auch eine While-Schleife. (while ($PreviousCat > -1)) erstelle_array()

                Ich gehe hier aber umgekehrt vor, d.h. nicht von einer Unterkat zurück zur obersten Kat, sondern von der obersten Ebene bis zur untersten.
                [COLOR=darkblue].: 1+1=23 :.[/COLOR]

                Kommentar


                • #9
                  .. so sieht die Funktion dazu aus:

                  PHP-Code:
                  function breadcrumbs($kat_darueber,$kat_bereich,$url_praefix,$bc_ende,$bereich_name="",$bereich_link="",$kats_ar=array()) {
                      while (
                  $kat_darueber 0) {
                          
                  $query mysql_query("SELECT id,name,kat_darueber FROM tab_kats WHERE id=".$kat_darueber." AND bereich=".$kat_bereich);
                          if (
                  mysql_num_rows($query)) {
                              
                  $result mysql_fetch_assoc($query);
                              
                  $kats_ar[] = array(
                                  
                  'name'=>$result['name'],
                                  
                  'id'=>$result['id']);
                              
                  $kat_darueber $result['kat_darueber'];
                          } else {
                              
                  fehler("Fehler bei der Breadcrumbs-Erstellung","no");
                          }
                      }
                      
                  $content "";
                      
                  // Reihenfolge umdrehen. Schlüssel bleiben nicht erhalten.
                      
                  $kats_ar array_reverse($kats_ar);
                      for (
                  $i=0;$icount($kats_ar);$i++) {
                          
                  $content.= "<a href=\"/index/".$url_praefix."-".$kats_ar[$i]['id'].".html\">".$kats_ar[$i]['name']."</a> &raquo; ";
                      }
                      
                  $bereich "";
                      if (
                  strlen($bereich_name) > && strlen($bereich_link) > 0) {
                          
                  $bereich "<a href=\"/index/".$bereich_link."\">".$bereich_name."</a> &raquo; ";
                      }
                      return 
                  "<p class=\"breadc\"><a href=\"/\">homepage.com</a> &raquo ".$bereich.$content.$bc_ende."</p>";

                  [COLOR=darkblue].: 1+1=23 :.[/COLOR]

                  Kommentar


                  • #10
                    Original geschrieben von syco23
                    typische Vorgehensweise für die Erstellung von Breadcrumbs. Dafür reicht aber auch eine While-Schleife. (while ($PreviousCat > -1)) erstelle_array()

                    Ich gehe hier aber umgekehrt vor, d.h. nicht von einer Unterkat zurück zur obersten Kat, sondern von der obersten Ebene bis zur untersten.
                    jo wäre auch ne möglichkeit und was ist wenn du mehrere kategorien mit x-beliebigen unterkategorien hast?

                    Kommentar


                    • #11
                      ich meinte, das du ja beim auruf der Funktion in der Funktion auch irgendwas mit dem Rückgabewert machen solltest.

                      Das tust du nicht, deswegen hab ich dei Zeile gepostet...

                      Kommentar


                      • #12
                        PHP-Code:
                        und was ist wenn du mehrere kategorien mit x-beliebigen unterkategorien hast
                        ?? Jede Kat hat nur eine kat_darueber, somit gibt es von jeder Kat x nur einen Weg zurück zur obersten Ebene..
                        Wenn du aber von der obersten Ebene ausgehst, ensteht ein Baum mit beliebig vielen Ästen und Verzweigungen - um diese Struktur auszulesen brauchst du eine rekusive Funktion.

                        .. oder worauf willst du hinaus?
                        [COLOR=darkblue].: 1+1=23 :.[/COLOR]

                        Kommentar

                        Lädt...
                        X