Hilfe bei Nested Sets?

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

  • Hilfe bei Nested Sets?

    Hallo,

    ich habe in einem csv-file eine Struktur mit id, parent_id und titel.
    1#0#Kategorie 1
    2#0#Kategorie 2
    3#1#Forum 1
    4#2#Forum 2
    5#3#Unter Forum 1
    6#4#Unter Forum 2
    die schreibe ich in ein 2 dimensionelles array. im 1. array befindet sich die id und im 2. array, befindet sich parent_id und titel sowie left_id und right_id. left_id und right_id setz ich bei einlesen erstmal auf 0.
    PHP-Code:
        $arrForums = array();
        
    $handle fopen("cat.txt""r");
        if (
    $handle):
            while (!
    feof($handle)):
                
    $exp explode('#',fgets($handle4096));
                
    $arrForums[$exp[0]] = array($exp[1],$exp[2],0,0);
            endwhile;
            
    fclose($handle);
        endif; 
    als zweiten Schritt möchte ich gern die left_id und right_id für jedes element ermitteln. komm mit dem prinzip von Nested Sets nicht klar, hab mich auch schon mit paar tuts rumgeschlagen. ohne erfolg auf durchblick.

    kann mir jemand da etwas auf die sprünge helfen, wie ich das realisieren könnte. vorallem wenn ich es in einem array setzen will und nicht direkt in die datenbank?

    Danke

  • #2
    Du mußt das nachbilden:
    http://www.klempert.de/nested_sets/artikel/#kap1

    eine Struktur mit id, parent_id und titel.
    und das reicht natürlich nicht aus !

    nested sets ticken anders, nämlich mit linkem und rechtem Wert - anders ausgedrückt:
    bei Deiner Struktur fehlt die Angabe WO sich das Element befindet
    (bei einem Untermenu z.B. ob es das erste oder zweite Menuelement ist.)
    Du könntest natürlich annehmen, daß das Element mit der niedrigsten ID ganz links steht und die anderen aufsteigend nach der ID sortiert rechts davon.

    Also brauchst Du ein Script welches Schritt für Schritt den Weg des Wurms nachbildet.
    Alle Fragen die sich der Wurm stellt, muß sich auch Dein Script stellen: gibt es ein Element rechts von mir mit einer höheren Id ? wenn nein -> hoch zum Parent-Element usw.

    Das würd ich erst mal in Pseudocode aufeschreiben und dann den richtigen Code.

    Um nested sets zu verstehn, solltest Du mal ein paar Bäume von Hand mit Kuli und Papier gezeichnet und beschriftet haben.

    Zuletzt geändert von Koala; 19.06.2007, 08:45.

    Kommentar


    • #3
      hab das tut schon komplett durchgelesen und hab es versucht nach zu bilden. aber raff das einfach nicht

      Kommentar


      • #4
        hab oben noch mal editiert - bitte lesen.

        ----------

        Warum tust Du Dir das an ?

        Und den Mist auch noch aus einer Textdatei auslesen und dann in ein Array ?

        Masochismus pur.

        P.S.: arbeitest Du mit PHP 3 ? endwhile ist schon lange nicht mehr aktuell.
        Zuletzt geändert von Koala; 19.06.2007, 08:49.

        Kommentar


        • #5
          Ich muss mir das antun! weil ich einen Import von Foren aus der CSV-Datei in das neue phpBB-Forum machen will.

          Dieses hat neben der Parent_ID eine Left_id und right_id. Und diese gilt es zu ermitteln. die patent_id hilft dabei zu sagen, welches element von welchem element abstammt.

          zu endwhile: ich nutze den alternativ-syntax weil er für mich wesentlich übersichtlicher ist und mir bei langem code sagt, welche schleife jetzt z.b. aufhört. so muss ich mich ne durch viele "}" kämpfen, wenn ich viel verschachtelt habe!

          Kommentar


          • #6
            ich hab Dir doch geschrieben wies geht !

            Erwartest Du jetzt ein fertiges Script ?

            Hier gibts Denkanstöße für Programmierer - Hilfe zur Selbsthilfe !

            Kommentar


            • #7
              http://www.google.de/search?q=adjace...ert+nested+set
              vor allem empfehlenswert sind die artikel von joe celco.
              ich nutze den alternativ-syntax weil er für mich wesentlich übersichtlicher ist und mir bei langem code sagt, welche schleife jetzt z.b. aufhört.
              schuld ist nicht die syntax, sondern der lange code.

              Kommentar


              • #8
                naja, hab das problem erstmal zu 75% gelöst, in dem das direkt in die sql-db geschrieben habe.

                ab parent_id 3 werden zwar die unterforen nciht angezeigt, abe im admin-panel schon. komisch!
                naja, mal sehen wo es klemmt.

                PHP-Code:
                    $arrForums = array();
                    
                $handle = @fopen("cat.txt""r");
                    if (
                $handle):
                        while (!
                feof($handle)):
                            
                $exp explode('#',fgets($handle4096));

                            if (
                $exp[1] == 0) {
                                
                $sql "INSERT INTO forums (forum_id,parent_id,left_id,right_id,forum_name,forum_type)
                VALUES ('"
                .$exp[0]."','".$exp[1]."','1','2','".$exp[2]."',0)";
                                
                $result mysql_query($sql);
                                echo 
                $sql.'<br />';

                            } else
                            {
                                
                $sql "SELECT right_id FROM forums WHERE forum_id='".$exp[1]."'";
                                
                $result mysql_query($sql);
                                
                $row mysql_fetch_array($result);
                                
                                
                $sql "UPDATE forums SET right_id=right_id+2 WHERE right_id>=".$row['right_id'];
                                
                $result mysql_query($sql);

                                
                $sql "UPDATE forums SET left_id=left_id+2 WHERE left_id>=".$row['right_id'];
                                
                $result mysql_query($sql);

                                
                $sql "INSERT INTO forums 
                (forum_id,parent_id,left_id,right_id,forum_name,forum_type,enable_icons,prune_days,prune_viewed,prune_freq) 
                VALUES ('"
                .$exp[0]."','".$exp[1]."','".$row['right_id']."','".($row['right_id']+1)."','".$exp[2]."',1,0,7,7,1)";
                                
                $result mysql_query($sql);

                                echo 
                $sql.'<br />';

                            }

                        endwhile;
                        
                fclose($handle);
                    endif; 
                Zuletzt geändert von TriphunEM; 19.06.2007, 11:22.

                Kommentar


                • #9
                  Original geschrieben von TriphunEM
                  naja, hab das problem erstmal zu 75% gelöst, in dem das direkt in die sql-db geschrieben habe.
                  das ist doch falsch. es sind verschiedene datenstrukturen. also sind es keine 75% sondern 0%.

                  brich deinen code um.

                  Kommentar


                  • #10
                    na funktioniert aber. den das erste forum mit allen unterforen wird genau so importiert wie ich mir das vorgestellt habe. warum es bei den anderen ne klappt, weiß ich noch ne!

                    Kommentar


                    • #11
                      na funktioniert aber.
                      dann wären es 100%.
                      den das erste forum mit allen unterforen wird genau so importiert wie ich mir das vorgestellt habe.
                      weil es ein zufall ist.
                      warum es bei den anderen ne klappt, weiß ich noch ne!
                      weil du die empfohlenen quellen nicht gelesen hast und keine ahnung hast, was eine adjazenzliste bzw. nested set ist.

                      Kommentar


                      • #12
                        doch genau mit dem tuts hab ich mich auseinander gesetzt und auch anhand dieser den code gemacht.
                        reiner zufall, dann zeig mir bitte die stellen woran das ganze scheitern soll. denn die db-struktur sieht eigentlich genau so aus, wie sie soll- oder ich hab was falsch verstanden!

                        Kommentar


                        • #13
                          das sieht schon besser aus.
                          lass dir nun alles queries ausgeben (samt fehlern) und kontrolliere ihre richtigkeit.
                          und benutze keine hochkommata für numerische spaltentypen.

                          Kommentar

                          Lädt...
                          X