Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Tabellen die sich selbst referenzieren

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Tabellen die sich selbst referenzieren

    Tach auch,

    ich habe eine DB-Tabelle mit den 3 Spalten id(INT), parent_id(INT), number(VARCHAR). Ziel der Tabelle ist es einträge zu verwalten, die auf einträge in der selben Tabelle verweisen, so das die Tabelle eigentlich eine Baumstruktur beinhaltet.

    Ich stand zwar schon öfter vor dem problem der in sich referenzierenden Tabellen, da es sich bisher aber maximalen um eine Tiefe von 3 handelte, habe ich mich mit Dirty lösungen zufrieden gegeben. Mein aktuelles Projekt kann aber (theoretisch) eine Tiefe von 25 erreichen und da möchte ich nicht unbedingt 25 foreach´s ineinander verschachteln.



    Hier mal ein beispiel wie ich bisher gearbeitet habe:

    Array nach abfrage der DB:
    PHP-Code:
    $a = array(
    => array(
    'id' => 1,
    'number' => '1',
    'parent_id' => 0
    ),
    => array(
    'id' => 2,
    'number' => '1.1',
    'parent_id' => 1
    ),
    => array(
    'id' => 3,
    'number' => '1.1.1',
    'parent_id' => 2
    ),
    => array(
    'id' => 4,
    'number' => '1.1.2',
    'parent_id' => 2
    ),
    => array(
    'id' => 5,
    'number' => '1.1.3',
    'parent_id' => 2
    ),
    => array(
    'id' => 6,
    'number' => '1.2',
    'parent_id' => 1
    ),
    => array(
    'id' => 7,
    'number' => '1.2.1',
    'parent_id' => 6
    ),
    => array(
    'id' => 8,
    'number' => '1.2.2',
    'parent_id' => 6
    ),
    => array(
    'id' => 9,
    'number' => '2',
    'parent_id' => 0
    ),
    => array(
    'id' => 10,
    'number' => '2.1',
    'parent_id' => 9
    ),
    10 => array(
    'id' => 11,
    'number' => '2.1.1',
    'parent_id' => 10
    ),
    11 => array(
    'id' => 12,
    'number' => '2.2',
    'parent_id' => 9
    ),
    12 => array(
    'id' => 13,
    'number' => '2.2.1',
    'parent_id' => 12
    ),
    13 => array(
    'id' => 14,
    'number' => '2.2.2',
    'parent_id' => 12
    ),
    14 => array(
    'id' => 15,
    'number' => '2.2.3',
    'parent_id' => 12
    ),
    15 => array(
    'id' => 16,
    'number' => '2.2.4',
    'parent_id' => 12
    )
    ); 
    Print des Arrays, nachdem anhand der parent_id, jeder eintrag einem parent als child zugewiesen wurde:
    PHP-Code:
    $a = array(
    => array(
    'number' => '1',
    'childs' => array(
    => array(
    'number' => '1.1',
    'childs' => array(
    => array(
    'number' => '1.1.1'
    ),
    => array(
    'number' => '1.1.2'
    ),
    => array(
    'number' => '1.1.3'
    )
    )
    ),
    => array(
    'number' => '1.2',
    'childs' => array(
    => array(
    'number' => '1.2.1'
    ),
    => array(
    'number' => '1.2.2'
    )
    )
    )
    )
    ),
    => array(
    'number' => '2',
    'childs' => array(
    => array(
    'number' => '2.1',
    'childs' => array(
    => array(
    'number' => '2.1.1'
    )
    )
    ),
    => array(
    'number' => '2.2',
    'childs' => array(
    => array(
    'number' => '2.2.1'
    ),
    => array(
    'number' => '2.2.2'
    ),
    => array(
    'number' => '2.2.3'
    ),
    => array(
    'number' => '2.2.4'
    )
    )
    )
    )
    )
    ); 
    Ausgabe der Inhalte des Arrays:
    PHP-Code:
    foreach($a as $b) {
    print 
    $b['number'] . '<br/>';
    foreach(
    $b['childs'] as $c) {
    print 
    $c['number'] . '<br/>';
    foreach(
    $c['childs'] as $d) {
    print 
    $d['number'] . '<br/>';
    }
    }

    Ausgabe:
    PHP-Code:
    1
    1.1
    1.1.1
    1.1.2
    1.1.3
    1.2
    1.2.1
    1.2.2
    2
    2.1
    2.1.1
    2.2
    2.2.1
    2.2.2
    2.2.3
    2.2.4 
    Mein Problem besteht also darin das ich zur ausgabe dann theoretisch 25 ineinander verschachtelte foreach´s benötigen würde. Was natürlich vollkommener schwachsinn ist.

    nachdem ich mich jetzt über 3 Stunden mit dem problem beschäftige und mittlerweile kopfschmezen bekomme wenn ich nur an eines der Code Fragmente oben denke, würde ich mich freuen wenn mir jemand helfen würde (Sowohl bei dir findung einer lösung als auch auf der Suche nach einem geeigneten Titel).

    Danke & Gruß
    Squall

  • #2
    Das Zauberwort lautet rekursive Funktion.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Wenn ich dich richtig verstehe meinst du mit rekursiv eine funktion wie:

      PHP-Code:
      function tree($a) {
      foreach(
      $a as $b) {
      print 
      $b['number'] . '<br/>';
      tree($b['childs']);
      }
      }
      tree($a); 
      Womit auch die Problemstufe 1 (übersichtlichkeit) gelöst währe.

      An der Stelle war ich aber auch schon vor knapp 2 Stunden was mich zu Problemstufe 2 geführt hat (Bin vorhin nicht weiter darauf eingegangen da ich nicht wusste ob mein problem überhaupt verständlich ist).

      ich möchte nähmlcih eigentlich nicht das:
      PHP-Code:
      foreach($a as $b) {
      print 
      $b['number'] . '<br/>';
      foreach(
      $b['childs'] as $c) {
      print 
      $c['number'] . '<br/>';
      foreach(
      $c['childs'] as $d) {
      print 
      $d['number'] . '<br/>';
      }
      }

      sondern sowas machen:
      PHP-Code:
      foreach($a as $b) {
      print 
      '<tr><td class="ebene_1">' $b['number'] . '</td></tr>';
      foreach(
      $b['childs'] as $c) {
      print 
      '<tr><td class="ebene_2">' $c['number'] . '</td></tr>';
      foreach(
      $c['childs'] as $d) {
      print 
      '<tr><td class="ebene_3">' $d['number'] . '</td></tr>';
      }
      }

      Und an der Stelle hat dann der verstand aufgehört mit zu spielen.

      Kommentar


      • #4
        Da musst Du Dich mit Zettel und Stift selbst durchkämpfen. Eine fertige Lösung bekommst Du nicht von mir.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          EDIT: Mist.. Der Beitrag war noch nicht fertig, sorry

          Käse.. kannst du den Post löschen, nikosch? Ich hatte irgendwo noch so eine ähnliche rekursive Funktion rumfliegen, die einen Verzeichnisbaum erzeugt. Find sie jetzt nicht mehr! Sorry!

          EDIT2: vielleicht doch noch was "konstruktives": Es heißt "children" und nicht "childs"
          [URL]http://hallophp.de[/URL]

          Kommentar


          • #6
            Zitat von nikosch Beitrag anzeigen
            Da musst Du Dich mit Zettel und Stift selbst durchkämpfen. Eine fertige Lösung bekommst Du nicht von mir.
            Danke, frage mich wieso ich nicht selbst darauf gekommen bin es erstmal alleine zu versuchen, bevor ich 1:30h in diesen verkackten Thread investiere.

            Ps.1: Ich habe noch nie eine fertige Lösung erwartet!

            Ps.2: Kannst weder du noch sonst jemand eine fertige Lösung anbieten, da ich diese sowieso erstmal an mein Script anpassen müsste.

            Ps.3: Du beschwerst dich jedesmal wenn jemand sein Problem nicht auf den Punkt bringen kann. Bringt man es denoch auf den Punkt, verweigerst du deine Hilfe. In meiner Sprache nennt man sowas einen Heuchlere.

            @Any other Mod
            Thema kann geschlossen werden. Die Lösung ist mir mittlerweile egal.

            Kommentar


            • #7
              Da hast du vermutlich Recht, aber eigentlich will er doch auch nur, dass du etwas lernst. Ich halte dich für clever, nikosch vermutlich auch, und vielleicht dachte er, er könne dir etwas mehr zumuten und die Idee mit Stift und Zettel ist doch keine Schlechte

              Außerdem bist du doch nicht auf seine Hilfe angewiesen, hier hätten sich ja auch noch weitere User beteiligen können!

              Hätte dir auch gerne geholfen. Aber so aus dem Nichts hatte ich leider keine Lust mich an so einer Funktion zu versuchen und meine "alte" Funktion habe ich leider nicht mehr gefunden

              Dieses Script: php4yourself.de - Baumdiagramm mit PHP erzeugen habe ich mal zum Zeichnen von Baumdiagrammen gecodet. Ist mitlerweile Überholgsbedürftig und auch nur für den Einsatz mit der GD-Bibliothek gedacht. Vielleicht kannst du aber die rekursive Funktion zum Zeichnen der Äste extrahieren! Die Beziehung Vater <-> Kind ist allerdings etwas anders und meiner Meinung nach nicht zu empfehlen (wie gesagt, ist leider nicht auf dem Neuesten Stand).
              [URL]http://hallophp.de[/URL]

              Kommentar


              • #8
                Dieses Board ist nicht Deine persönliche Trollwiese.

                [MOD: Thread wieder hergestellt]

                Ich finde die Reaktion vollkommen unangemessen.
                und vielleicht dachte er, er könne dir etwas mehr zumuten und die Idee mit Stift und Zettel ist doch keine Schlechte
                Ganz genau. Zettel und Stift ist ein guter Tipp, immer wenn man sich in etwas verrannt hat. Eine Nacht drüber schlafen auch. Hier alles zu löschen und ungehalten reagieren nicht.
                Und an der Stelle hat dann der verstand aufgehört mit zu spielen.
                Antworten wie diese sind i.A. billige Ausreden. In allen anderen Fällen sind es nutzlose Informationen, weil sie nicht beschreiben, woran man gescheitert ist.
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #9
                  Vielleicht hilft dir der link hier weiter:

                  nested sets
                  I like cooking my family and my pets.
                  Use commas. Don't be a psycho.
                  [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

                  Kommentar


                  • #10
                    Also nur mal so überflogen, aber ich denke, daß man mit ner vernünftgen SQL-Anweisung ein dem entsprechend verarbeitbares Array erhalten kann, mit dem die Ausgabe relativ einfach ist...

                    Ansonsten ist der Link von rudygotya das, was Du brauchst...
                    Competence-Center -> Enjoy the Informatrix
                    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                    Kommentar


                    • #11
                      Einspruch Nested Sets sind beim ersten mal auf keinen Fall einfach.
                      Das wird schon komplex, aber durchbeissen lohnt sich.
                      I like cooking my family and my pets.
                      Use commas. Don't be a psycho.
                      [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

                      Kommentar


                      • #12
                        Ihr bringt jetzt eine völlig neue DB-Struktur (Nested Sets) ins Spiel, aber das geht am Problem vorbei.
                        Squall hält die Datensätze mit der Parent-Child-Methode in der DB und das Auslesen und Überführen in eine hirachische Array-Struktur ist auch nicht das Problem.

                        Ich denke, es hapert an der Generierung des verschachtelten HTML-Codes, aber das genaue Problem konnte ich auch nicht herauslesen.

                        Aber Squall hat ja eh kein Interesse mehr an der Lösung, oder vielleicht doch?

                        Komm' schon Squall, spiel' hier nicht die beleidigte Leberwurst

                        Kommentar


                        • #13
                          @rudygotya
                          Über das Tutorial bin ich bei meinen recherchen gestern auch gestoßen und habe es mir zum größten Teil auch durchgelesen. Allerdings hatte ich auch irgendwo gelesen, dass Nested Sets erst ab einer Datenmenge von 10.000+ zu empfehlen sind, da sie relativ langsam sind. Bin aber nach wie vor am überlegen ob ich meine DB-Struktur darauf anpasse.

                          @yab
                          Das Problem hast du richtig erkannt, es liegt nicht beim auslesen oder zusammenstellen, sondern daran dass ich "kosmetisch" mit meiner Lösung der Ausgabe nicht zufreiden bin/war.

                          @Asipak:
                          Außerdem bist du doch nicht auf seine Hilfe angewiesen, hier hätten sich ja auch noch weitere User beteiligen können!
                          Diesen Ratschlag werde ich mir in Zukunft vor Augen halten, bevor ich das nächste mal Explodiere
                          Edit: Danke für den Hinweis bezüglich childrens

                          Schlusswort:
                          Mittlerweile habe ich eine (akzeptable) Lösung gefunden:
                          PHP-Code:
                          function tree($a$ebene) {
                              foreach(
                          $a as $b) {
                                  print 
                          '<tr><td class="ebene_' $ebene '">' $b['number'] . '</td></tr>';
                                  
                          tree($b['childs'], ($ebene 1));
                              }
                          }

                          tree($a0); 
                          Desweiteren möchte ich mich für mein gestriges verhalten entschuldingen. Ich war ziemlich gereizt/genervt/entmutigt, nachdem mir dieses problem jeden weiteren Schritt versperrt hat und ich mich schon den ganzen Tag damit beschäftigt hatte. Es war auch unfair euch gegenüber, mich wegen der inkompetenz eines einzelnen, der meinung und Hilfe der anderen zu verweigern.

                          -------------
                          PN@nikosch:
                          Deine aussage:
                          Da musst Du Dich mit Zettel und Stift selbst durchkämpfen.
                          Ist gleichzustellen mit einem "Mach dein scheiss doch selbst!" und ich denke nicht, dass das der Sinn dieser Plattform ist.

                          Ps: Meine Wortwahl in diesem Beitrag ist bewusst Provokant gewählt. Ich denke nicht dass du inkompetent bist. Viel mehr vermute ich, dass du den Sinn eines solchen Forums vergessen hast.

                          Ich hätte dir dass gerne als PN zukommen lassen, da du aber nichtmal meine PN bezüglich meiner Anfrage zur Mitarbeit an der Wiki beantwortet hast, würde ich hirauf wahrscheinlich auch ewig auf eine warten.
                          -------------

                          Kommentar


                          • #14
                            Ach weisst Du, hier hat man jeden Tag mit Leuten zu tun, die noch nie verstanden haben, was der Sinn des Forums ist. Ob Du dazu gehörst, musst Du selbst beurteilen.

                            Ich habe solche Lösungen auch schon im Board gepostet, ich wüsste nicht, warum hier jeder User ne Extrawurst braucht, nur weil er eben ein anderer ist. DAS ist mit Sicherheit auch nicht SInn des Forums, alles ständig neu zu posten.

                            http://www.php.de/php-fortgeschritte...tml#post358078

                            Die Wikimitgliedschaft habe ich genau deswegen nicht entschieden, weil ich mir eben nicht sicher war, ob Du da der Richtige bist. Zugegebn haben ich die PN irgendwann aus den Augen verloren. Du bist nicht der Einzige, der mir im Monat Nachrichten schickt.
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar


                            • #15
                              Ach weisst Du, hier hat man jeden Tag mit Leuten zu tun, die noch nie verstanden haben, was der Sinn des Forums ist. Ob Du dazu gehörst, musst Du selbst beurteilen.
                              Für mich ist ein Forum ein weg um mit anderen, über ein Thema zu diskutieren dass für beide Parteien von interesse ist. Wer sich nicht dafür interessiert und trotzdem Postet wird im allgemeinen als Spamer/Flammer bezeichnet.

                              Ich habe solche Lösungen auch schon im Board gepostet, ich wüsste nicht, warum hier jeder User ne Extrawurst braucht, nur weil er eben ein anderer ist. DAS ist mit Sicherheit auch nicht SInn des Forums, alles ständig neu zu posten.
                              Im Grunde hast du ja recht, ständig das selber Thema zu behandeln ist natürlich auch nervig. Allerdings komme ich Persönlich mit der Forensuche überhaupt nicht klar, denn egal was ich da eingebe, ich bekomme immer eine Flut von ergebnissen von dennen gerademal ein Bruchteil relevant ist.

                              Ich weiß zwar nicht ob das ein allgemeines Problem ist oder nur ich damit nicht klar komme. Jedenfalls war daß der Anlass wieso ich mich an der Wiki beteiligen wollte, um eine FAQ zu erstellen in der die immer wiederkehrenden Fragen beantwortet werden und von jedem schnell und einfach gefunden/verlinkt werden können.

                              Die Wikimitgliedschaft habe ich genau deswegen nicht entschieden, weil ich mir eben nicht sicher war, ob Du da der Richtige bist. Zugegebn haben ich die PN irgendwann aus den Augen verloren. Du bist nicht der Einzige, der mir im Monat Nachrichten schickt.
                              Immer schön Sportlich bleiben , ich habe volles verständnis dafür daß so eine entscheidung ein bisschen zeit benötigt, nachdem ich einige Tage nach meinem Antrag nichts gehört hatte, habe ich so oder so ähnlich (soweit ich mich erinnern kann) eine PN geschrieben:
                              Wie lange schätzt du wird es dauern bis ihr über meinen beitritt entschieden habt?
                              Eine Antwort auf diese Frage zu finden sollte eigentlich nicht all zu schwer sein, eigentlich wollte ich nur ein lebenszeichen haben, daß ihr überhaupt darüber nachdenkt und meine Anfrage nicht irgendwo im Nirvana gelandet ist. Nachdem du mir nicht geantwortet hast, habe ich halt vermutet daß du kein Lust hast dich damit zu befassen oder ich abgelehnt wurde, es aber nicht für nötig erachtet wurde mich darüber zu Informieren.

                              Mit einem "Kann ich nicht genau sagen, meld dich in einer Woche/Monat wieder." währe ich vollkommen zufrieden gewesen und es währe nie zu diesem missverständnis gekommen.

                              Kommentar

                              Lädt...
                              X