Ankündigung

Einklappen
Keine Ankündigung bisher.

navigation erstellen - mysql - datenbankstruktur ändern

Einklappen

Neue Werbung 2019

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

  • navigation erstellen - mysql - datenbankstruktur ändern

    In einem Feld (s. Zitat) sind auf diese Weise Kategorien gespeichert. Nun möchte ich eine Navigation daraus bilden, die folgendermaßen aufgebaut ist.

    Prozente
    - Wohnen
    - - Wohntextilien
    - - - Teppiche

    Mit einer einfachen Schleife und Trennung (explode - " > ") komme ich nicht klar/weiter, da sich viele Einträge wiederholen. Kann mir bitte jemand dabei weiterhelfen?

    Damenmode > Mäntel > Kurzmäntel
    Damenmode > Shirts > 3/4 lange Ärmel
    Damenmode > Mäntel > Kurzmäntel
    Wohnen > Stehleuchten
    Wohnen > Stehleuchten
    Baumarkt > Beleuchtung > Glühlampen
    Prozente > Wohnen > Kindermöbel
    Prozente > Wohnen > Kindermöbel
    Prozente > Wohnen > Heim & Garten > Haus & Wohnen
    Prozente > Damen > Jung & Trendy > Shirts
    Damenmode > Damenschuhe > Pumps > Sling- & Spangenpumps
    Prozente > Damen > Freizeit & Basics > Strickjacken
    Damenmode > Shirts
    Damenmode > Shirts
    Damenmode > Shirts > Blusenshirts
    Damenmode > Shirts > Blusenshirts
    Prozente > Wohnen > Wohntextilien > Teppiche
    Prozente > Wohnen > Wohntextilien > Teppiche
    Wohnen > für den Boden > Teppiche > Modern & Muster
    Prozente > Neu im Shop > Damenmode > Schuhe & Co
    Damenmode > Pullover > Carmen Stil
    Damenmode > Mode für Sie > Modetrends > top in Preis und Mode
    Damenmode > Mode für Sie > Modetrends > top in Preis und Mode
    Damenmode > Mode für Sie > Modetrends > top in Preis und Mode
    Gruß
    David


  • #2
    meinst du Nested Sets: http://www.develnet.org/36.html

    Kommentar


    • #3
      Zitat von YaB
      meinst du Nested Sets: http://www.develnet.org/36.html
      Ich denke nicht. Netsted Sets sind nur eine bestimmte Art, Daten zu speichern und davon hängt natürlich das Vorgehen ab.

      Daher kann dir (ohne zu spekulieren) niemand helfen, wenn du nicht angibst, a) wie die Daten vorliegen und b) wie die Ausgabe denn genau aussehen soll (die beiden Beispiele oben sind ja unterschiedlich).

      Übrigens verwendet man zum Abbilden von Listen und Aufzählungen in HTML für gewöhnlich die Tags <ul> und[*] und formatiert das dann via CSS (warum? -> http://css.maxdesign.com.au/listamatic/about-why.htm). Schau dir dazu z.B. mal folgende Beispiele an:

      http://css.maxdesign.com.au/listamatic/horizontal33.htm
      http://css.maxdesign.com.au/listamatic2/vertical01.htm

      Basti

      Kommentar


      • #4
        Danke, für eure Antworten. Mit der ersten Quelle kann ich leider nichts anfangen. Und die HTML-Formatierung steht jetzt noch nicht zur Diskussion, das kommt erst später.

        Daher kann dir (ohne zu spekulieren) niemand helfen, wenn du nicht angibst, a) wie die Daten vorliegen und b) wie die Ausgabe denn genau aussehen soll (die beiden Beispiele oben sind ja unterschiedlich).
        Ich habe eine csv-Datei hochgeladen, die später in eine MySQL-Datenbank importiert wird. Du kannst dir angucken wie die Daten vorliegen.

        http://www.dm-fc.com/tmp.csv
        Gruß
        David

        Kommentar


        • #5
          Dann mach dich doch erstmal dran, diese Daten auszulesen und in die Datenbank zu stopfen. Die Frage ist einfach, wie du den Baum aufbaust. Davon hängt dann ab, wie du die Daten ausliest und wie diese nach dem Auslesen vorliegen.

          Bei sowas bieten sich Nested Sets tatsächlich an, da der Baum a) klein sein wird und b) nicht oft geändert werden wird und Nested Sets eben sehr nett ausgelesen werden können.

          Basti

          Kommentar


          • #6
            Würde das mit verschachteltem Array lösen. Quasi:

            Navi[0]=Damenmode
            Navi[1]=Wohnen
            Navi[2]=Baumarkt
            ....

            Damenmode ist dann wieder ein array mit Mäntel,Shirts usw.

            Ist dann später sehr einfach mit foreach zu durchlaufen.

            Kommentar


            • #7
              Das funktioniert nur solange sich die einzelnen Kategorien anhand ihres
              Namens eindeutig identifizieren lassen. Hast du z.B. in den Kategorien
              "Damenmode" und "Wohnen" jeweils eine Unterkategorie "Schnäppchen"
              (Schnäppchenjagt ist ja sowas wie ein Volkssport) oder sowohl in
              Damen- als auch in Herrenmode eine Unterkategorie "Shirts", dann haut
              das nichtmehr hin.

              In dem Fall wäre eher sowas angebracht, meine ich:

              PHP-Code:
              <?php
              $aCats 
              = array(
                  
              'damenmode' => array(
                      
              'label' => 'Damenmode',
                      
              'subcats' => array(
                          
              'damenshirts' => array(
                              
              'label' => 'Shirts',
                          )
                      )
                  ),
                  
              'herrenmode' => array(
                      
              'label' => 'Herrenmode',
                      
              'subcats' => array(
                          
              'herrenshirts' => array(
                              
              'label' => 'Shirts',
                          )
                      )
                  )
              );
              ?>
              ...und das dann rekursiv durcharbeiten.

              Basti

              Kommentar


              • #8
                Du hast mich falsch verstanden.

                Bei mir wird das auch später so sein:
                navi= array(Damenmode=array(Unterkategorie,nochneunterka tegorie),Wohnen=array(Unterkategorie,nochneunterka tegorie))

                Das kann dann beliebig in die Tiefe gehen.

                Kommentar


                • #9
                  Ichglaub, ich hab dich schon richtig verstanden. Nimm mal dein Beispiel. Dort dast du zwei Kategorien mit dem Namen "Unterkategorie" und nochmal zwei mit dem Namen "nochneunterkategorie". Wenn du daraus nun eine Navigation generieren würdest, hättest du zwei Punkte "Unterkategorie" (was ja eal auch sicherlich so sein kann; siehe "Schnäppchen" oder "Shirt"). Nur ist diese Bezeichnung dann kein Identifikator mehr, sondern ein beliebiger, womöglich mehrfach benutzter Name und ein Link nach cat=Unterkategorie führt dich eben irgendwo hin, aber nicht zwingend nach Damenmode.Unterkategorie bzw. Wohnen.Untekategorie.

                  Du musst, falls das Label einer Kategorie kein eindeutiger Bezeichner ist der Kategorie einen anderen, eindeutiken Identifikator zuweisen und dann hat jeder Knoten in deinem Baum schonmal zwei Attribute: Die ID und das Label und das kannst du mit deiner Array-Struktur nicht abbilden.

                  Basti

                  Kommentar


                  • #10
                    Wie du sicher weisst, hat ein assoziatives Array eh partout schonmal 2 Werte. Denn auch ein assoziatives Array ist numerisch adressierbar. Demnach ist es kein Problem den Link einfach mit der genauen Adresse auszustatten.
                    Im übrigen war das aber auch erstmal nicht vorraussetzung. Und wenn du jedem Knoten eine eindeutige (linearansteigende) ID geben willst ist das auch machbar indem du einfach jeden Knoten als Array darstellst mit Knoten=array(ID,childs) wobei Child wieder nen array aus Knoten ist.
                    Hier kommen wir dann nur gerade an den Punkt, wo es bald sinnvoll ist ne Klasse draus zu machen, der man dann auch gleich die passenden Funktionen zur Ausgabe an die Hand gibt.

                    n8

                    Chris

                    Kommentar


                    • #11
                      Zitat von CC84
                      Wie du sicher weisst, hat ein assoziatives Array eh partout
                      schonmal 2 Werte. Denn auch ein assoziatives Array ist numerisch
                      adressierbar. Demnach ist es kein Problem den Link einfach mit der
                      genauen Adresse auszustatten.
                      Was meinst du damit, dass ein assoz. Array partout 2 Werte hat? Ein
                      assoz. Array ist eine Reihe von Elementen, die durch Schlüssel
                      addressierbar sind. Den Schlüssel bildet bei deinem Vorschlag der (im
                      Kontext des gesamten Baumes nicht eindeutige) Name der Kategorie und
                      der Wert des Elements ist ein assoz. Array, das die untergeordnten
                      Kategorien enthält.

                      Und du willst jetzt den numerischen Index als Identifikaor hernehmen?
                      Erstmal ist das extrem undurchsichtig. Vor allem aber, woher nimmst du
                      die Zuordnung? Du kannst sie ja nur im Moment des Erzeugens des
                      Arrays selbst festlegen. Die Zuordnung geht jedoch in dem Moment
                      verloren, in dem sich der Prozess des Zuordnens ändert, z.B. durch eine
                      andere Sortierung in der Datenbankabfrage oder auch nur durch eine
                      Änderung am Datenbestand. Abgesehen davon muss die Zuordnung beim
                      Rücklauf des Formulars erst wieder hergestellt werden.

                      Das ist wie wenn deine Bibliotheksausweisnummer der Position deines
                      Namens in der alphabetisch geordneten Liste aller Bibliotheksbenutzer
                      entsprechen würde. Du bekämst vermutlich eine Mahnung nach der
                      anderen für alle möglichen Bücher, nur nicht für die, die du dir ausgeliehen
                      hast.

                      Und wenn du jedem Knoten eine eindeutige (linearansteigende) ID
                      geben willst ist das auch machbar indem du einfach jeden Knoten als
                      Array darstellst mit Knoten=array(ID,childs) wobei Child wieder nen array
                      aus Knoten ist.
                      List du die Beiträge nicht? Genau das hab ich doch als Verbesserung auf
                      deinen Vorschlag oben vorgeschlagen.

                      Basti

                      Kommentar


                      • #12
                        das ist zu kompliziert für mich. was noch anzumerken ist, es sind run 25.000 datensätze. die kategorien wiederholen sich zwar, sind aber zuviele um diese einzeln in arrays zu packen, wenn ich das richtig verstanden habe.

                        vllt kann man noch ein feld in der db erstellen und mittels eines scripts jeder kategorie einen wert zuweisen?
                        Gruß
                        David

                        Kommentar


                        • #13
                          So da ich gerade ein bisschen Zeit habe, schreibe ich dir mal was etwas längeres.

                          Wenn ich das richtig sehe, hast du aktuell die Daten in der Datenbank stehen, wie du sie da zitiert hast, richtig??

                          Wenn ja, darf ich dir den Tipp geben, die Daten ganz umzustrukturieren?

                          Ich würde folgende DB Struktur vorschlagen:

                          ID(int) Name(varchar255)ParentID(int)

                          Weiter ist ID als Primarykey zu definieren.

                          Nun musst du dir ein Script schreiben, dass deine alte Struktur in die neue Struktur überführt.

                          Ich würde dazu zuerst das oben von mir genannte Array erstellen und dieses dann in die Datenbank schreiben. Ich sage dir aber gleich, das wird nicht ganz einfach werden. Bzw. einfach schon, aber es bedarf einer menge logischer Denkarbeit, um das ganze zu verstehen.

                          Ich schreibe das nun einfach mal so frei runter, ob es dann klappt kann ich dir nicht garantieren. Ich gehe hierbei davon aus, dass deine Daten als array zur Verfügung stehen.

                          Also deine Zeilen:
                          Damenmode > Mäntel > Kurzmäntel
                          Damenmode > Shirts > 3/4 lange Ärmel
                          Damenmode > Mäntel > Kurzmäntel

                          Etwa so:
                          $kategorie[0]=Damenmode > Mäntel > Kurzmäntel
                          $kategorie[1]=Damenmode > Shirts > 3/4 lange Ärmel
                          ...

                          Dabei fällt mir gerade auf, du hast in deinem Beispiel schon doppelzeilen drin. Das ist ungünstig, würde ich sagen!!

                          Die solltest du wenn du das Array erstellt hast, erstmal filtern.

                          Etwa so:

                          PHP-Code:
                          <?php 
                            
                          for($i=0;$i<count($kategorie);$i++){
                              
                          $found false;
                                for (
                          $i2=$i+1;$i2<count($kategorie);$i2++)
                                    if (
                          $kategorie[$i]==$kategorie[$i2]) $found=true;
                                if (!
                          $found$kategorieclean[]=$kategorie[$i];
                            }
                          ?>
                          So erstmal Frühstück, Fortsetzung kommt dann gleich.

                          So weiter gehts:

                          PHP-Code:
                          <?php
                              $kategorie 
                          $kategorieclean;
                              function 
                          insertValue(&$tree,$nodes){
                                  
                                  if (!isset(
                          $tree[$nodes[0]])) $tree[$nodes[0]] = array();
                                  if (
                          count($nodes)>1insertValue($tree[$nodes[0]],array_slice($nodes,1));
                                  
                              }
                              
                              foreach(
                          $kategorie as $string){
                                  
                          $nodes explode(' > ',$string);
                                  
                          insertValue($root,$nodes);
                              }
                          ?>

                          So danach hast du dann in root deine Menüstruktur liegen.

                          Kannst du dir mit
                          PHP-Code:
                          print_r($root); 
                          ansehen.

                          So und nun das speichern in die DB:
                          PHP-Code:
                          <?php
                              mysql_connect
                          ("localhost","php","php"); 
                              
                          mysql_select_db("php-forum");

                              function 
                          writeToDB($tree,$parentID){
                                  echo 
                          "hier bin ich $parentID ";
                                  foreach (
                          $tree as $nodename => $subnodes){
                                   
                          $sqlstring "INSERT into menu(`name`,`parentID`) VALUES ('$nodename','$parentID')";
                                   
                          mysql_query($sqlstring);
                                   echo 
                          mysql_error();
                                   if  (
                          count($subnodes)>0writeToDB($subnodes,mysql_insert_id());
                                  } 
                              }
                              
                          writeToDB($root,-1);
                          ?>

                          Kommentar


                          • #14
                            Zitat von CC84
                            Wie du sicher weisst, hat ein assoziatives Array eh partout schonmal 2 Werte. Denn auch ein assoziatives Array ist numerisch adressierbar.
                            Ich weiß eher ganz sicher, dass das totaler Unsinn ist!
                            Mit 2 Werte meinst Du ja anscheinend 2 Schlüssel für den gleichen Wert.

                            Wie Basti schon gesagt hat, wäre eine numerische Adressierung absolut unbrauchbar, weil man den Index ja nicht kennen würde.

                            Abgesehen davon ist die Behauptung einfach nur falsch.

                            Hier ein kurzes Beispiel zum Ausprobieren:

                            PHP-Code:
                            <?php
                            $arr 
                            = array("a"=>"Apfel""b"=>"Birne");

                            echo 
                            'var_dump($arr):
                            '
                            ;
                            var_dump($arr);
                            echo 
                            "
                            "
                            ;

                            echo 
                            'print_r($arr):
                            '
                            ;
                            print_r($arr);
                            echo 
                            "
                            "
                            ;

                            echo 
                            'print_r($arr[0]):
                            '
                            ;
                            print_r($arr[0]);
                            echo 
                            "
                            "
                            ;

                            echo 
                            'print_r($arr["a"]):
                            '
                            ;
                            print_r($arr['a']);
                            echo 
                            "
                            "
                            ;
                            ?>
                            Die Ausgabe ist wie (zumindest von mir) erwartet:
                            var_dump($arr):
                            array(2) { ["a"]=> string(5) "Apfel" ["b"]=> string(5) "Birne" }
                            print_r($arr):
                            Array ( [a] => Apfel [b] => Birne )
                            print_r($arr[0]):

                            print_r($arr["a"]):
                            Apfel
                            Du siehst, dass bei $arr[0] nix ausgegeben wurde. Steht ja auch nix drin bei dem Index. Nach Deiner Theorie müsste ich die Elemente ja mit Index 0 und 1 ansprechen können.

                            Deine falsche Annahme kommt vermutlich daher, dass Du mal mysql_fetch_array() ohne Angabe des Array-Typs aufgerufen hast und Dir anschließend das Ergebnis angeguckt hast.

                            In so einem Array sind tatsächlich auch numerische Schlüssel für die Spalten enthalten. Aber nur, weil der Wert auch doppelt eingetragen wird.

                            Das Array hat dann doppelt so viele Einträge wie ein einfaches assoziatives Array.
                            **********************************
                            Nein, ich bin nicht die Signatur.
                            Ich putze hier nur.
                            **********************************

                            Kommentar


                            • #15
                              Jaja ist mir auch eingefallen, ka, was ich da durcheinander geworden habe. Habe aber ja mittlerweile dennoch eine funktionierende Variante geschrieben.

                              Kommentar

                              Lädt...
                              X