PHP - Galerien Listung - REKURSION

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

  • #46
    Original geschrieben von h3ll
    PHP 4 wurde Ende August offiziell eingestellt. Sollte man so oder so nicht mehr benutzen.
    Ich weiss! Ich kann leider die Umgebung nicht beeinflussen!
    WHILE (!$asleep) { $sheep++; }

    Kommentar


    • #47
      Original geschrieben von nichtsooft
      @asp2php Denke das wird unter PHP4 nicht laufen! :-/
      Du hast garnicht reingeguckt ... das ist in php4 geschrieben, denn zu der Zeit gab es php5 nicht!

      Kommentar


      • #48
        Original geschrieben von asp2php
        Du hast garnicht reingeguckt ... das ist in php4 geschrieben, denn zu der Zeit gab es php5 nicht!
        Hey!? Ich bin grad dabei das zu testen! Guck dir mal an wie schnell mein RPLY kam! Da ist's doch klar, dass ich das noch nicht antesten konnte! Nochdazu muss ich mich jetzt erst rumspielen, wie ich das auf MYsql umstricke....
        Zuletzt geändert von nichtsooft; 05.11.2008, 09:51.
        WHILE (!$asleep) { $sheep++; }

        Kommentar


        • #49
          Original geschrieben von nichtsooft
          Hey!? Ich bin grad dabei das zu testen! Guck dir mal an wie schnell mein RPLY kam! Da ist's doch klar, dass ich das noch nicht antesten konnte! Nochdazu muss ich mich jetzt erst rumspielen, wie ich das auf MYsql umstricke....
          Wenn du noch garnicht reingeguckt hast, woher dann die Vermutung dass es nicht unter PHP4 läuft? Arbeitest du immer so? Wenn deine Kollegen Vorschläge machen, dann sagst du immer sofort dass es nicht geht, ohne drüber nachzudenken oder zu prüfen?

          Kommentar


          • #50
            Original geschrieben von asp2php
            Wenn du noch garnicht reingeguckt hast, woher dann die Vermutung dass es nicht unter PHP4 läuft? Arbeitest du immer so? Wenn deine Kollegen Vorschläge machen, dann sagst du immer sofort dass es nicht geht, ohne drüber nachzudenken oder zu prüfen?
            Zugegeben hab ich mir wenigstens den Einleitungstext reingezogen und als ich da Klasse gelesen hab, war mein erster Gedanke PHP5 weil ich objektorientiert bislang immer nur an PHP5 Projekten rumgepfuscht hab.... Also bitte nicht sauer sein!
            WHILE (!$asleep) { $sheep++; }

            Kommentar


            • #51
              Du solltest es nicht nur ausgeben lassen, sondern darüber nachdenken warum wo welcher Wert raus kommt und nicht der den du willst.

              call-by-value vs. call-by-reference sag ich dazu nur:
              PHP-Code:
              function echoarray($var$depth=0, &$cnt=1$sub=0) { 

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #52
                Ja *lol* !?

                Ich wusste garnicht, dass es diese Möglichkeit in PHP überhaupt gibt!
                -> http://www.wellho.net/slideshow/bynamebyvalue.jpg
                In diesem Fall kann ich mich nur selbst mit einem *RTFM* bestrafen, dir danken ghost und hoffen, dass du noch etwas Geduld für mich aufbringst um mir beim letzten verbleibenden Problem zu helfen!

                Meine Idee hierzu wäre:
                Ich weiss wieviele SUBs ein Punkt hat und bis diese Zahl gezählt wird, füge ich den nachkommenden Zeilen (sofern diese auch SUB sind und nicht den selben $parent haben) so nen senkrechten Strich hinzu...
                Zuletzt geändert von nichtsooft; 05.11.2008, 11:29.
                WHILE (!$asleep) { $sheep++; }

                Kommentar


                • #53
                  Ich verstehe dein Problem nicht...
                  Du willst bei Subebenen zweiter Ebene in den vorigen Ebenen den senkrechten Strich mitführen? Also praktisch in einer Zeile nicht nur eine Grafik, sondern pro Subebene darüber noch jeweils eine?

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #54
                    Ja so in der Art! Wenn du dir mal den aktuellen Status ansiehst, wird dir die Problematik auf den ersten Blick bewusst: Status
                    WHILE (!$asleep) { $sheep++; }

                    Kommentar


                    • #55
                      Du wirst wohl nicht drumherum kommen eine Abart einer Stack-Implementation mit durch alle Instanzen der Rekursion zu schleifen.
                      Heißt jeder Aufruf kriegt noch z.B. ein Array übergeben in dem für jede vorige Ebene definiert ist, ob eine Linie hin soll oder nicht.
                      (Ja, das ist nicht ganz einfach das gebe ich zu - wirst du trotzdem selbst dich dran versuchen müssen.)

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #56
                        Gelöst!
                        Dank dem Einsatz eines meiner Studienkollegen läuft das jetzt!
                        Original geschrieben von HoaX
                        ...Wird wahrscheinlich nicht die eleganteste lösung sein, aber es funzt!
                        ...zumindest wenn sich die Datenmengen in Grenzen halten!
                        Keine Ahnung wieviel Overhead und Performanceverlust bei großen Datenmengen ist...
                        PHP-Code:
                        function get_categories() {
                            
                        $return = array();
                            
                            
                        $result mysql_query("
                                SELECT id, name, subof
                                FROM site_galleries
                                WHERE issub=0
                            "
                        );        // element level 0
                            
                            
                        while ($row mysql_fetch_assoc($result)) {
                                
                        $therow get_sub($row['id']);  
                                if (
                        $therow) {        // kind(er) vorhanden
                                    
                        $return[] = array($row"SUB" => $therow);        // beinhaltet array mit kind(ern)
                                
                        } else {        // leeres parent
                                    
                        $return[] = array($row);
                                }
                            }
                            
                            return 
                        $return;
                        }

                        function 
                        get_sub($parent) {
                            
                        $return = array();
                            
                            
                        $result mysql_query("
                                SELECT id, name, subof
                                FROM site_galleries
                                WHERE issub=1
                                AND subof='"
                        .$parent."'
                            "
                        );        // element level >0
                            
                            
                        while ($row mysql_fetch_assoc($result)) {
                                
                        $therow get_sub($row['id']);
                                
                                if (
                        $therow) {        // kind(er) vorhanden
                                    
                        $return[] = array($row'SUB' => $therow);        // beinhaltet array mit kind(ern)
                                
                        } else {        // leeres element
                                    
                        $return[] = array($row);
                                }
                            }
                            
                            return 
                        $return;
                        }

                        function 
                        echoarray($var$depth=0, &$cnt=1$sub=0, &$stack=array()) {
                            
                        /**
                             * $var: array mit aktuellem knoten (& kindern)
                             * $depth: tiefe dieses knotens
                             * $cnt: zeilenbg
                             * $sub: anzahl entries auf gleichem level mit gleichem root
                             * $stack: wenn array -> line-info fuer jede div-ebene [stack[x] == 0 --> keine linie; stack[x] == 1 --> linie]
                             */
                            
                        $i 0;
                            
                            foreach (
                        $var as $val) {
                                
                        $i++;
                                
                                
                        /* zeilenbg abwechselnd */
                                
                        if ($cnt == 0) {
                                    
                        $bgcolor "#f1f5fa";
                                    
                        $cnt 1;
                                } else {
                                    
                        $bgcolor "#fff";
                                    
                        $cnt 0;
                                }
                                
                                echo 
                        "\t<div class=\"galline\" style=\"background-color: ".$bgcolor.";\">\n";        // zeilencontainer
                                
                                /* vertikale linien zeichnen */
                                
                        $j 0;
                                while (
                        $j $depth) {
                                    if (
                        $stack[$j]) {        // arraystelle = 1 --> vertikale linie
                                        
                        echo "\t\t<div class=\"admsubico\"><img src=\"../pics/icons/therearesubs.gif\" class=\"thesubico\"></div>\n";
                                    } else {                
                        // arraystelle = 0 --> leeres div
                                        
                        if ($j) {        // kein root-element
                                            
                        echo "\t\t<div class=\"rueck\"></div>\n";
                                        }
                                    }
                                    
                        $j++;
                                }
                                
                                
                        /* tree-div */
                                
                        if ($sub != 0) {                    // mehr als ein element auf gleicher ebene
                                    
                        if ($i == count($var)) {        // aktuelles element = anzahl der element auf ebene
                                        
                        echo "\t\t<div class=\"admsubico\"><img src=\"../pics/icons/itsasub.gif\" class=\"thesubico\"></div>\n";        // letztes sub
                                    
                        } else {
                                        echo 
                        "\t\t<div class=\"admsubico\"><img src=\"../pics/icons/itaresub.gif\" class=\"thesubico\"></div>\n";        // zwischensub
                                    
                        }
                                }
                                
                                echo 
                        "\t\t<div class=\"galname\">".$val[0]["name"]."</div>\n";        // line-text
                                
                        echo "\t</div>\n";                                                    // ende line
                                
                                /* kinder der aktuellen zeile ausgeben, sofern vorhanden */
                                
                        if (isset($val["SUB"])) {            // element hat kind(er)
                                    
                        if ($sub>and $depth) {        // mehr als 1 element in selber ebene && nicht root (-> depth=0)-element
                                        
                        $stack[$depth] = 1;            // senkrechte linie ist zu zeichnen
                                    
                        } else {                        // entweder root oder nur ein element in ebene
                                        
                        $stack[$depth] = 0;            // nichts zeichnen
                                    
                        }
                                    
                        echoarray($val["SUB"], $depth+1$cntcount($val["SUB"]), $stack);        // funktion fuer kinder aufrufen
                                
                        }
                            }
                        }

                        echo 
                        "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n";
                        echo 
                        "<HTML>\n";
                        echo 
                        "<HEAD>\n";
                        echo 
                        "<TITLE>TEST</TITLE>\n";
                        echo 
                        "<LINK REL=\"stylesheet\" type=\"text/css\" HREF=\"test.css\">";
                        echo 
                        "</HEAD>\n";
                        echo 
                        "<BODY>\n";

                        echoarray(get_categories());

                        echo 
                        "\t<BR><BR><BR><BR>\n";
                        // echo "\tDem Baum fehlen noch immer einige senkrechte Linien!\n";

                        echo "</BODY>\n";
                        echo 
                        "</HTML>\n";

                        // fat props to TEH HoaX!!! ;)

                        ?> 
                        Das Snippet ist selbstverständlich zur freien Entnahme! Nen passenden DB-Dump gibt's in einem der vorangegangenen Posts...

                        Lg. aus Wien.

                        SRY dass der Code nicht extra fürs Forum formatiert wurde...
                        WHILE (!$asleep) { $sheep++; }

                        Kommentar


                        • #57
                          Nachtrag:
                          Das Ganze gibt's selbstverständlich auch als Pulldown:

                          PHP-Code:
                          function galasselect($var$depth=0, &$cnt=1$sub=0) {
                              
                          $i 0;
                              FOREACH (
                          $var as $val) {
                                  
                          $i++; 
                                  
                          $rueck $depth 16;
                                  IF (
                          $sub != 0) {        // WENN ES SICH UM EINE SUBgalerie handelt...
                                    
                          $class "norm";     
                                  } ELSE {  
                                    
                          $class "bold";     
                                  }
                                  echo 
                          "\t\t<OPTION CLASS=\"".$class."\" STYLE=\"padding: 0 0 0 ".$rueck."px;\" VALUE=\"".$val[0]["id"]."\">".$val[0]["name"]."</OPTION>\n";
                                  IF (isset(
                          $val["SUB"])) {
                                      
                          $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0;
                                      
                          // echo $cnt;
                                      
                          galasselect($val["SUB"], $depth+1$cnt$anzahl);
                                  }
                              }

                          Und die Ausgabe:
                          PHP-Code:
                          echo "\t<SELECT NAME=\"gallist\" ID=\"gallist\" STYLE=\"width: 550px; border: 1px solid #abc6dd; background-color: #e5effd;\">\n";
                          echo 
                          "\t\t<OPTION CLASS=\"norm\" VALUE=\"nope\" SELECTED>Wählen Sie eine Galerie...</OPTION>\n";
                          galasselect(get_categories());
                          echo 
                          "\t</SELECT>\n"
                          Lg. Berny
                          WHILE (!$asleep) { $sheep++; }

                          Kommentar

                          Lädt...
                          X