Problem mit Rekursion

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

  • Problem mit Rekursion

    Hallo Leute,
    hier mein Problem:
    Ich hab ein Kategoriesystem entworfen das in der Tiefe nicht beschränkt ist.
    Funktioniert auch soweit...hier ein Auszug aus der Datenbank:

    Tabelle Kategorie
    Code:
    catid     name     parentid     parentlist
    1         t1       0            0
    2         t2       0            0
    3         subt1    1            0.1
    4         subt2    2            0.2
    5         subsub   3            0.1.3
    und nun möchte ich mit Hilfe dieser Daten den Code einer DropDown Box generieren die aussieht wie folgt.
    PHP-Code:
    <select name="katid">
    <
    option value="0"> <i>(keine Kategorie)</i></option>
    <
    option value="1"> >t1 </option>
    <
    option value="3"> =>subt1 </option>
    <
    option value="1"> ==>subsub</option>
    <
    option value="2"> >t2 </option>
    <
    option value="4"> =>subt1 </option>
    </
    select
    hierfür benutze ich folgenden Code

    PHP-Code:
     function filebase_OutputKategorieComboListe($parentid=0)
          {        
          
    $result $db->query("SELECT * FROM kategorie
              WHERE parentid = 
    $parentid ORDER BY name");

          
    $num_rows $db->num_rows();
                
          if(
    $parentid==0)
            {
              
    $flist '<select name="katid">';
          
    $flist .= '<option value="0"><i>(keine Kategorie)</i></option>';
            }
                
          for(
    $i=0;$i<$num_rows;$i++)
            {
              
    $db->row_seek($i,$result);
              
    $db->fetch_row($row,$result);

              
    //Line String generieren
              
    $line "";
              
    $deep substr_count($row['parentlist'],'.');
              for(
    $ii=0;$ii<$deep;$ii++)
                {
                  
    $line .= "=";
                }
              
    $line .= ">";
                                        
              
    $flist .= '<option
    value="'
    .$row['kategorieid'].'">'.$line.$row['name'].'</option>';

              
    //Unterkategorien (Rekursion)
              
    $flist .= filebase_OutputKategorieComboListe($row['kategorieid']);
            }
    //end for

          
    if($parentid==0$flist .= '</select>';

          return(
    $flist);
          }
    //end function 
    das funktioniert auch soweit... nur hab ich eben die Rekursion drin
    und das belastet die Datenbank.
    kennt jemand eine möglichkeit wie ich mit möglichst nur einer Abfrage eine solche DropDown Box erstellen kann?

    bye
    Micha
    Zuletzt geändert von mk85; 23.04.2005, 13:23.

  • #2
    beachte bitte http://www.php-resource.de/forum/sho...threadid=50454 und editiere dein post.

    soweit ich weiß verlangt das von dir gewählte adjacency list model diese rekursion und ist anders nicht lösbar. bei kleinen applikationen hat es keine große auswirkung auf die performance, bei größeren sollte man dagegen nested sets o.a. wählen.

    aber ich bin mir nicht sicher, ob es so stimmt, wie ich es sage und würde mich freuen, belehrt zu werden.

    Kommentar


    • #3
      Ich würde die Daten aus der DB in einen Array einlesen und dann so mit einer for Schleife die DropDow box füllen. Da muss man nicht jedesmal auslesen, sonder es wird aus dem Array geholt

      PHP-Code:
      echo '<select name="katid">';
      for (
      $a=0;$a<5;$a++)
      {
         echo 
      '<option value="'.$kategorieid[$a].'">'.$option[$a].'</option>';
      }
      echo 
      '</select>'
      Mein Homepage: Click

      Kommentar


      • #4
        Jacky: dies ist nicht der mittelpunkt der performance optimierung. tatsache ist, dass der baum nicht anders als rekursiv einlesbar ist, sodass es so oder so zu einer menge anfragen an die db kommt. das ist der langsamste teil der applikation. ob das array direkt verarbeitet wird oder nicht, ist eine kleinigkeit und ist in diesem falle unwichtig.

        ich übertreibe ein wenig, um es zu verdeutlichen - du schlägst vor,
        Code:
        for($i=0;$i<=1000;$i++)$line = "";
        durch
        Code:
        for($i=0;$i<=1000;$i++)$line = NULL;
        zu ersetzen, weil es weniger speicher beansprucht, während die gesamte applikation inhaltlich nicht optimiert ist (und in meinem beispiel sogar gar keinen sinn ergibt).

        Kommentar


        • #5
          hm wenn du aber vorher alle kategorien in ein array lädst und das dann verarbeitest sparst du dir zumindest schonmal einige queries was durchaus wichtig für die performance ist.

          Kommentar


          • #6
            andererseits ist zu viel cachen auch nicht resourcen-schonend...
            teste einfach alle änderungen iterativ mit microtime() und ziehe deine eigenen schlüsse daraus.

            Kommentar

            Lädt...
            X