Mehrdimensionales Array durchsuchen und neue Daten einfügen

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

  • Mehrdimensionales Array durchsuchen und neue Daten einfügen

    Hallo,

    ich fummel hier jetzt schon seit Stunden an einem Script rum und komme da nicht weiter.

    Kurze Erklärung zur Ausgangslage...

    Es geht um User in einer Datenbank.
    Ein User kann Unteruser anlegen und dieser wiederum kann dies auch.
    Die Struktur kann z.B. folgendermaßen aussehen...

    Code:
    User1 (id: 1)
    	User1_1 (id: 2)
    		User1_1_1 (id: 3)
    		User1_1_2 (id: 4)
    			User1_1_2_1 (id: 5)
    	User1_2 (id: 6)
    	User1_3 (id: 7)
    User2 (id: 8)
    In der Datenbank sind die wichtigen Spalten "id" und "user_id".
    "user_id" ist NULL wenn es sich dabei um einen Hauptuser handelt (hat also keinen mehr über sich)
    Ansonsten steht immer die ID des Users dem dieser User gehört.
    Beispiel:
    id - user_id
    1 - null
    2 - 1
    3 - 2
    4 - 2
    5 - 4
    6 - 1
    7 - 1
    8 - null

    Ich möchte das nun auslesen und auch so darstellen. Das Problem ist natürlich dass es unendlich weit verschachtelt sein kann.

    Mir fehlt leider der letzte Anstoß zur Lösung.
    Bin auch momentan an einem Punkt wo mir nichts sinnvolles mehr dazu einfällt weil ich schon so lang daran bastel.

    Ich schreibe mir ein Array mit der ID als Key. Jetzt war meine Idee diesen Key zu suchen und das Array dann dort zu erweitern.
    Doch wie durchsuche ich das Array und erweiter es dann?
    Und wie lese ich das am besten danach aus, so dass ich eine Darstellung wie oben zu sehen ist, abzubilden?

    Danke

    Manione

  • #2
    Das nennt sich Nested Sets. Einfach mal googlen, da gibt es genug Beispiele. Zum Beispiel hier: http://www.php-resource.de/tutorials...-mit-SQL,1.htm

    Gruß
    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Danke dir für diesen Anstoß.
      Das ist mir leider völlig neu.

      Das Tut werde mir mal in Ruhe durchlesen.
      Sollte ich damit nicht klar kommen, kommt hier noch die ein oder andere Frage

      Kommentar


      • #4
        Also wenn ich das richtig verstehe, ist das in meinem Fall nicht so sinnvoll.

        Die Userliste wird stetig erweitert und ich müsste also bei jedem neuen User alle Datensätze updaten um die Struktur zu haben.
        Das ist natürlich suboptimal, oder?

        Kommentar


        • #5
          Zitat von Manione Beitrag anzeigen
          Also wenn ich das richtig verstehe, ist das in meinem Fall nicht so sinnvoll.

          Die Userliste wird stetig erweitert und ich müsste also bei jedem neuen User alle Datensätze updaten um die Struktur zu haben.
          Das ist natürlich suboptimal, oder?
          Du könntest auch ein generisches Datenbankmodell nutzen, Aber da joinst du dir einen Wolf. Oder du arbeitest PHP-seitig mit Rekursionen. Um was geht es denn bei dir genau? Vielleicht ist dein Datenbankmodell auch falsch.

          Gruß
          Peter
          Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
          Meine Seite

          Kommentar


          • #6
            Oder du legst dir eine simple Zuordnungstabelle an.

            Code:
            Alle User:
            UID   |  User
            1     |  Admin
            2     |  Willi
            3     |  Hermann
            4     |  Ernst
            5     |  Heinz

            Zuordnung wer wurde von wem angelegt (gehört wem)
            Code:
            UID   | ZID (Zugeordnete ID)
            1     |  2  # Admin hat Willi angelegt
            1     |  4  # Admin hat Ernst angelegt
            2     |  3  # Willi hat Hermann angelegt
            3     |  5  # Hermann hat Heinz angelegt
            Um deine Nested Sets abzubilden, brauchst du nun nur noch deine Usertabelle von der kleinesten ID angefangen durchzugehen.
            Zuletzt geändert von SysOp; 05.07.2017, 08:22.

            Kommentar


            • #7
              @Kropff, ich hab ein Backend in dem jeder User sich einloggen kann und eigene User anlegen kann. Diese neu angelegten User sind dann Unteruser von diesem der sie angelegt hat.
              Tabelle sieht wie folgt aus...

              [User]
              - id
              - name
              - user_id (hier steht die ID des Users der diesen angelegt hat)
              (+einige andere Spalten die hiermit nichts zu tun haben)

              @SysOp, im Grunde hab ich diese Zuordnungstabelle. Nur nicht als eigenständige Tabelle. Ich habe in der User-Tabelle ein Feld namens user_id. Darin ist die ID des Users enthalten der diesen User angelegt hat. Der User auf der 1. Ebene hat dort NULL stehen.
              Wenn ich das mit Nested Set mache, muss ich doch bei jedem neuen User, alle Einträge updaten. Bei größerer Userzahl, kann das schon enorm werden, oder?

              Kommentar


              • #8
                Mensch, war das eine Geburt.

                Ich hab es jetzt folgendermaßen gelöst... (überflüssigen Code hab ich natürlich entfernt!)

                PHP-Code:
                // Ausgabe-Script
                foreach ($userliste AS $user)
                {
                    
                $checkSubUser $Benutzer->checkSubUser($user["id"]);

                    if (
                $checkSubUser !== false)
                    {
                        
                $Benutzer->outputSubUser($user["id"], $user["name"], 20);
                    }
                }

                // Klasse
                class Benutzer
                {    
                    public function 
                checkSubUser($id)
                    {
                        
                /*
                         * SQL-Abfrage
                         */

                        
                return $result;
                    }

                    public function 
                outputSubUser($id$oberuser$padding)
                    {
                        
                /*
                         * SQL-Abfrage
                         */

                        
                if ($results !== false)
                        {
                            foreach (
                $results AS $result)
                            {
                                
                $checkSubUser $this->checkSubUser($result["id"]);

                                if (
                $checkSubUser === true)
                                {
                                    
                $this->outputSubUser($result["id"], $result["name"], $padding 10);
                                }
                            }
                        }
                    }

                Habe bereits so viel Zeit verschwendet an dem Problem, dass mir das so erstmal ausreicht im Moment.

                Danke euch für die Unterstützung

                Kommentar

                Lädt...
                X