1 | Kat1 | 1; 2; 3;
2 | Kat2 | 1; 6; 8;
id | podkat
1 | abc
2 | bbb
3 | xxx
6 | asd
8 | ppp
2 Tablele co nie? To to samo co:
1 | Kat1 | abc;bbb;xxx
W sumie nic nie stoi na przeszkodzie, aby dać to w powyższej formie jedynie to pamięć jaką używasz.
Lepiej chyba nawet dać to tak, że kategorie w 1-nej tabeli, a podkategorie w 2-giej - gdzie dodatkowo będą miały kolumnę z id kategorii głównej (dla identyfikacji) - parent id. Teraz Jak byś chciał zrobić 3-stopniowe drzewo, to sytuacja już się zmienia... Jeszcze bardziej się komplikuje jak chciałbyś przypisać 2 podkategorie do różnych kategorii etc.
Pobierając te 2 tabele wyżej mamy w pamięci 2 tablice:
$x = array('0' => array('1', 'Kat1', '1;2;3'), '1' => array('2', 'Kat2', '1;6;8'))
Z tego mogę wygenerować 2 linki lub 2 elementy ul, gdzie jakiś refId będzie id Kategorii - to przekieruje nas do strony o id 1 - odpowiedzialną za stronę zbiorczą dla Kat1
Teraz dla każdego ul chcemy wygenerować podkategorie - linki. Do tego używamy np. explode.
Czyli dla linku zbiorczego mamy id z $x[0][0], a tablice podkategori wyciągamy z $x[0][2], nazwa Kategori to $x[0][1].
Ok. mam tablicę, którą wykonałem z $x[0][2] -> powiedzmy $y = array('0'=>'1', '1'=>'2', '2'=>'3') (bo $y = explode(';', '1;2;3') tak nam wygeneruje), a ponieważ wcześniej zessałem z bazy nazwy podkategorii - to mam też nazwy dla ich id.
Nie wiem jak to dogłębniej wytłumaczyć - nie piszę ludziom kodów, staram się dać "wędkę"

Muszę zaznaczyć kurde, że to jest tylko 1 z wielu wielu możliwych rozwiązań! Można np. Dać tabelę, gdzie masz coś takiego - i co jest o wiele łatwiejsze:
id | nazwa | id_rodzica
1 | aaa | 2 - to będzie pokazane pod abc
2 | abc | 0 - główny rodzic, to będzie pokazane od razu
3 | bbb | 1 - to będzie pokazane pod aaa
4 | bcd | 0 - główny rodzic...
Tylko pytanie jak zrobić, aby kilka podkategorii miało wielu rodziców i żeby bazy były optymalne? Ile koderów tyle rozwiązań.
Np moje rozwiązanie dla wielu menu (oczywiście mam trochę bardziej rozbudowane etc. a mój mini cms tym zarządza - coś musi ;D Bo po co ręcznie coś doklepywać?)
Tworzę kilka tabel:
1) Linki
link_id | nazwa
1 | aaa
2 | bbb
3 | ccc
4 | ddd
5 | eee
6 | fff
2) Menusy:
menu_id | nazwa
1 | menu główne
2 | menu lewe
3) Drzewko:
lp | menu_id | rodzic | link_id | sila
1 | 1 | 0 | 1 | 0
2 | 1 | 0 | 2 | 0
3 | 1 | 1 | 3 | 0
4 | 1 | 3 | 4 | 0
5 | 1 | 1 | 5 | 0
6 | 1 | 2 | 5 | 0
7 | 1 | 2 | 6 | 0
8 | 2 | 1 | 5 | 0
9 | 2 | 2 | 6 | 0
Większość danych przechowywana jest wyżej, a nazwy, które często zmieniać się nie będą - powyżej.
Teraz ja np. generuje sobie menu co jakiś czas lub gdy wyczerpie się ostatni produkt z asortymentu - dzięki temu w moim sklepie nie ma czegoś takiego jak "ups sory kurde, ale nie ma produktu w tej kategorii etc."
Jak wygenerować menu?
a) zależnie od tego gdzie menu i które wyświetlamy - pobieramy odpowiednie dane (albo wszystko od razu i mamy w pamięci już wszystkie dane) np. dla menu_id - 1 -> główne menu...

sprawdzamy rodzica - jeżeli 0, to pokazujemy - sortujemy wg. siły
c) jeżeli już pokazaliśmy rodzica, to dla niego pokazujemy wszystkie dzieci, które mają rodzica - 1, lub 2 (zauważ, że mamy 2-ch głównych rodziców: 1 i 2, bo w kolumnie rodzic jest 0, a 0 nie będzie użyte jako id linku więc możemy to użyć jako jakąś główną wytyczną)
d) dla rodzica 1 - mamy linki: 3 i 5
e) dla rodzica 2 - mamy linki: 5 i 6 -> czyli wyświetlamy link 5 (czyli eee - nazwa) pod rodzicem 1 i 2.
f) a co z linkiem id 4? Jego rodzic to link id 3, który jest pod rodzicem 1. Dlatego musimy dla każdego sublinku i sub sub itd. sprawdzić czy mamy dla niego dzieci

Pokmiń, spróbuj coś takiego zrobić. Ja teraz mam swoje problemy

(ajaxowa edycja usera, gdzie każdy mój user ma swoją bazę ze swoimi userami, których może edytować, a żeby było ciekawie każdy mój user ma dynamiczne tabele - pytania... Też edytowalne Ehh) jak coś to jutro rano kolejne wskazówki. Choć powinieneś już to zrobić.
Chwila zastanowienia, rozrysuj to sobie na papierze i będzie dobrze.
To się rozpisałem