Tach!
Also die bisherigen Beiträge habe ich ja leider nicht wirklich nachvollziehen können,
Dass der Inhalt von IDs bedeutungslos sein sollte, hast du sicher verstanden. Das bringt dich im eigentlichen Problem nicht weiter, aber wenn man sich dies beherzigt, muss man sich keinerlei Gedanken mehr um über die Lückenhaftigkeit machen.
Nested Sets ist ein Fachbegriff für eine Abbildungsart hierarchischer Daten in einer flachen Datentabelle. Sie bringen einige Vorteile, wenn man Teilmengen abfragen möchte (besonders, wenn man mehr als zwei Ebenen hat), sind aber deutlich komplexer bei Änderungen. Wenn du keine Teilbäume sondern stets den gesamten Kategorienbaum benötigst, bringt dir Nested Sets keinen wirklichen Vorteil. Das Abfrageergebnis ist in jedem Fall flach, und wenn man daraus ein verschachteltes Array haben möchte, ist das in beiden Fällen gleich aufwendig.
allerdings habe ich in der Zwischenzeit meine eigene Lösung deutlich verkürzt und vereinfacht:
Bei der alten war auch nicht schön, dass du mit variablen Variablen hantiert hast. Als Faustregel: Wenn du beim Programmieren noch nicht weißt, welche Namen zur Laufzeit entstehen, dann willst du lieber ein Array statt einzelner Variablen. Einzelne Variablen bringen dann keinen Vorteil, eher Nachteile, zum Beispiel beim Iterieren.
Mit 2 DB Abfragen werden die Daten der beiden Tabellen
Warum sind es überhaupt zwei Tabellen? Sind die Daten von Haupt- und Unterkategorie so verschieden? Wenn sie gleich sind, dann nähme ich eine Tabelle im Stile deiner jetzigen Unterkategorie-Tabelle und die Hauptkategorien bekommen einen Parent-Zeiger mit dem Wert 0 (oder NULL).
in einem assoziativen Array gespeichert ('$rows_kategorien' und '$rows_unterkategorien')
Also in _je_ einem. Spricht war gegen ein verschachteltes, bei dem die Unterkategorien zur jeweilgen Hauptkategorie zugeordnet sind? Das sieht dann am Ende so aus:
$categories = array(
1 => array(
'name' => 'Name Kat 1'
'subcategories' => array(
2 => 'Name UnterKat 2',
3 => 'Name UnterKat 3',
),
),
8 => array(
'name' => 'Name Kat 8'
'subcategories' => array(
23 => 'Name UnterKat 23',
42 => 'Name UnterKat 42',
),
),
);
Damit komtm noch eine weitere Array-Ebene ins Spiel, aber irgendwie muss man ja die Hauptkategoriedaten zusammenhalten. Das Ergebnis dieser Struktur ist, dass du nun gezielt über die Unterkategorien iterieren kannst und dabei nicht die Parent-ID überprüfen musst. Es ist nur ein wenig aufwendiger diese Struktur zu erstellen. Sortiere die Datensätze so, dass die mit Parent = 0/NULL zuerst kommen. Dann kannst du zuerst die Hauptkategorien erstellen und die nachfolgenden Unterkategorien einhängen.
Das ist zwar performancelastiger, aber im Code um ein Vielfaches kürzer und simpler. Und da es sich in meinem Fall um maximal 10-30 Kategorien mit jeweils maximal bis zu 10-20 Unterkategorien handelt, ist, was die Geschwindigkeit der Skriptabarbeitung und somit des Seitenaufbaus bezrifft, bis dato kein Delay bemerkbar.
Performance spielt bei solch einer kleinen Datenmenge üblicherweise noch keine Rolle.
dedlfix.