Mach das bloß nicht rekursiv, sondern informiere Dich zum Thema "nested sets".
Das ist eine Technik beliebig tief verschachtelte Bäume resourcenschonend in Datenbanken abzulegen und auszulesen. Du wirst hier im Forum dazu fündig.![]()
Hallo,
ich habe ein kleines Problem:
ich habe eine MySQL-Tabelle, die Produktkategorien enthält. Jede Kategorie kann beliebig viele Unterkategorien haben, jede Unterkategorie wieder beliebig viele weitere Unterkategorien usw. Die Tiefe der Verschachtelung ist nicht begrenzt.
Die Struktur der Tabelle ist wie folgt:
Feld:
catid
pid
tid
catname
catid ist die eindeutige ID-Nummer jeder Kategorie.
pid ist die ID der übergeordneten Kategorie
tid ist die ID der übergeordneten Kategorie des obersten Levels, welche immer die pid=0 hat
catname der Name der Kategorie
Ich versuche jetzt, eine Funktion zu bauen, die es mir erlaubt, von einer beliebigen Kategorie aus alle Unterkategorien zu ermitteln und in ein Array zu übergeben, dass danach ausgewertet werden kann.
Die Funktion sieht bis jetzt so aus:
Aufgerufen wird die Funktion an einer beliebigen Stelle des Skripts über:PHP-Code:function findsubcats($id,$liste) {
global $db;
$query=$db->query("SELECT * FROM kategorien WHERE pid='$id'");
$anzahl=$db->num_rows($query);
while ($result=$db->fetch_array($query)) {
$id=$result[catid];
array_push($liste,$id);
findsubcats($id);
}
return $liste;
}
wobei $catid die ID einer beliebigen Kategorie sein soll.PHP-Code:$subcats=findsubcats($catid)
Zurückgeben soll die Funktion ein Array mit allen Unterkategorien. Und eben diese Rückgabe funktioniert so nicht.
Wenn ich mir innerhalb der while-Schleife die Variable $id per echo anzeigen lasse, sehe ich, dass tatsächlich alle Subkategorien gefunden werden, aber der Aufbau des Arrays $liste funktioniert nicht.
Am Ende enthält $subcats nur die IDs der Subkategorien im ersten untergeordneten Level.
Ich hoffe, ich habe mich jetzt einigermaßen verständlich ausgedrückt
Hat jemand eine Idee, wo hier der Fehler liegt? Ich grübele jetzt schon seit 2 Tagen über Sache und komme alleine wohl nicht mehr weiter.
Gruß
Wolfgang
Mach das bloß nicht rekursiv, sondern informiere Dich zum Thema "nested sets".
Das ist eine Technik beliebig tief verschachtelte Bäume resourcenschonend in Datenbanken abzulegen und auszulesen. Du wirst hier im Forum dazu fündig.![]()
Genau, und zwar direkt eine Tür weiter im Tutorial Board: Nested Set
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Okay, danke, ich werd mich mal schlau machen. Ist wohl tatsächlich besser geeignet. Blos dumm, dass die MySQL-Tabelle mit ca. 3000 Kategorien schon vorliegt![]()
erstell doch eine Umhängetabelle für Kategorien, dann brauchst Du keine Rekursion.
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
ich meine den Baum abzubilden, da gibt es mehrere Möglichkeiten, hier mal eine
jetzt kannst Du entweder in der Ursprungstabelle zu jeder Kategorie den Baum ablegen, z.B.PHP-Code:$tree=array();
while($row=mysql_fetch_assoc($res)) {
$tree[$pid][]=$row['catid'];
}
$cattree=serialize($tree[$catid]);
oder eine Kommaliste produzieren und in eine eigene Tabelle eintragen.
Sicher gibts noch mehr Möglichkeiten.
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
Nachdem ich mich jetzt mal näher mit dem Thema Nested Sets beschäftigt habe, habe ich mich entschlossen, dass Problem auf diese Weise zu lösen. Funktioniert bis jetzt einwandfrei. Und die Datenbank werde ich halt neu erstellen, ist zwar ein wenig aufwendig, aber ich denke, der Aufwand lohnt sich.
Vielen Dank für eure Tipps!![]()
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)