ShortFred Geschrieben 28. Februar 2012 Teilen Geschrieben 28. Februar 2012 Hi, Also ich habe folgendes Problem: Es ist eine CSV vorhanden in der die Herachie von Produkten eingetragen ist. 1;2;3;4;5; Produkt1;;;;; ;Produkt2;;;; ;;Produkt3;;; ;;;Produkt4;; ;;;;Produkt5; Produkt1;;;;; Jetzt möchte ich zu jedem Produkt abhängig von der tiefe eine eindeutige id erzeugen. Es soll aber auch unabhängig davon sein wie Tief diese herachie geht. (Also auch tiefer als 5) die ids sollen dann so aussehen: Produkt1: 01 Produkt2: 01.01 Produkt3: 01.01.01 Produkt4: 01.01.01.01 Produkt5: 01.01.01.01.01 Produkt1: 02 und natürlich auch hochzählen! Bisher habe ich alles in PHP gemacht. Ich bin soweit, dass ich die Produkte alle untereinander in einem Array gespeichert habe und kann auch passend zu jedem Produkt die Ebene ausgeben. Desweiteren kann ich mir anhand des Headers 1;2;3;4;5 auch ausgeben lassen wie viele Ebenen es gibt. Mein erster Ansatz war das ganze über eine Rekursion zu lösen, wobei ich allerdings kläglich gescheitert bin:( Mir kommt immer wieder in den weg, dass es beliebig viele Ebenen sein können. Und ich so iwie kaum ne Id erzeugen kann. Jetzt habe ich allerdings keinen Lösungsansatz mehr und hoffe das ihr mir weiter helfen könnt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
afo Geschrieben 28. Februar 2012 Teilen Geschrieben 28. Februar 2012 Ich würde für die Datenhaltung von dieser kruden Darstellung weg und ein einfaches GUID;Parent-GUID Modell nehmen. Also bei jedem Untergeordneten Produkt wird in die Spalte Parent-GUID die GUID des übergeordneten Produkts eingetragen. Das kannst du dann rekursiv auslesen und als Tree, oder auch in deiner Matrixform ganz einfach ausgeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShortFred Geschrieben 28. Februar 2012 Autor Teilen Geschrieben 28. Februar 2012 Ich würde für die Datenhaltung von dieser kruden Darstellung weg Verstehe nicht so ganz was du meinst Ich möchte aus der Herachie der Prudkte herraus diese Id erstellen. 01.01.01.01.01 bzw 02.03.03 oder 05.05.03.01 etc. So erstmal mein Ansatz: Akuelleebene ermitteln wenn Aktuelleebene gleich der nächsten Ebene ist Code ermitteln wenn Aktuelleebene größer als die nächste ist Funktion Rekursiv aufrufen (quasi so lange tiefer gehen bis ich am ende bin) wenn Aktuelleebene kleiner als die nächste ist Code ermitteln Und es hapert am Code ermitteln ich bekomme es nicht hin passend hoch zu zählen und den Zähler passend zurück zu setzen und ich glaube es reichen 2 varibalen hier nicht aus! Kann man in PHP variablen über eine zählschleife erzeugen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etreu Geschrieben 28. Februar 2012 Teilen Geschrieben 28. Februar 2012 Du brauchst z.B. einen Stack der den Pfad im darstellt. So in der Art kannst du die Hierarchie aus der Datei bestimmen, vorausgesetzt die Daten sind so angeordnet, wie du es im Beispiel angegeben hast. stack<node> = new stack<node>(n) while not EOF node = zeileLesen ebene = ebeneBestimmen(node) if (stack.top != null && stack.top.ebene > ebene) node.parent = stack.top stack.push(node) else while(stack.top != null && stack.top.ebene <= ebene) stack.pop() end while node.parent = stack.top stack.push(node) end if end while Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ShortFred Geschrieben 28. Februar 2012 Autor Teilen Geschrieben 28. Februar 2012 Also die Herachie kann ich schon so weit ausgeben, bekomme aber nur nullen und einsen!:-D So sieths aus: 01 01.01 01.01.01 01.01.01 //Hier sollte egt Hochgezählt werden also 01.01.02 01. // hier auch also 02 01.01 // und hier dann natürlich auch 02.02 01.01 // Und hier 02.03 Hier mal mein bisheriger Codebrei, ich bin für jede Kritik offen;) Variablen: $arrayDef Hier stehn die Produkte drin Ebene+Produkt Bsp:$arrayDef[0] == 0Produkt1, $arrayDef[1] == 1Produkt2 private function writecode($parentid) { $zaehler=1; $code=".0".$zaehler; For ($this->x; $this->x < $this->anzZei; $this->x++) { $zahljetzt=$this->arrayDef[$this->x]{0}; if ($zahljetzt == $parentid) { for ($i=0;$i<=$parentid;$i++) { echo $code; } echo $this->arrayDef[$this->x]; echo '<br>'; } else { if ($zahljetzt > $parentid) { $this->zaehlergleich=0; $parentid=$zahljetzt; $zaehler1=1; for ($i=0;$i<$parentid;$i++) { echo $code; } echo $code; echo $this->arrayDef[$this->x]; echo '<br>'; $this->x++; $this->writecode($parentid); } if ($zahljetzt < $parentid) { $this->zaehlergleich=0; $parentid=$zahljetzt; for ($i=0;$i<=$parentid;$i++) { echo $code; } echo $this->arrayDef[$this->x]; echo '<br>'; $this->x++; $this->writecode($parentid); } } } } Zufrieden bin ich mit dem Code aber iwie auch nicht wirklich! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 28. Februar 2012 Teilen Geschrieben 28. Februar 2012 Benutze bitte Code-Tags ! Für die Nummerierung nimm' ein Array und baue es rekursiv auf. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etreu Geschrieben 29. Februar 2012 Teilen Geschrieben 29. Februar 2012 ids = array() while not EOF node = zeileLesen ebene = ebeneBestimmen(node) if (ids.length < ebene) ids.push(0) node.id = implode(".", ids) else while(ids.length > 0 && ids.length >= ebene) last = ids.pop() end while node.id = implode(".", ids).(last+1) ids.push(last+1) end if end while Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.