Fastruktúra bejárása

Üdv!

PHP-ban szereték egy fa struktúrát bejárni és megjeleníteni. Mezők az adatbázisban: id,name,parent_id.
egyszerű példa:
1,Computers,-
2,HP,1
3,IBM,1
4,Acer,1
5,HP Laptops,2
6,HP Desktops,2

Valami ilyesmit kellene látni:

  • Computers
    • HP
      • HP Laptops
      • HP Desktops
    • IBM
    • Acer

A PHP iterators-nál nézelődtem, de nem tűnt használhatónak.
Van ötlete valakinek mivel tudnám bejárni a fát, hogy megjelenítsem?

Hozzászólások

DB-specifikus módszerrel. Google: hierarchical query

My 2 cents:

Első lépés: adatbázistól és a lekérdezés-típusától függően egy-két keresés:
MySQL - nested set, ha többnyire lekérdezni fogod és viszonylag ritkán kell új elemet felvinni. Játszhatsz indexekkel és szöveges mezőkkel olyasmit, mint a PostgreSQL-es ltree, ha mindig csak subtree keresést akarsz csinálni (egy csomó művelet viszont PITA így).
PostgreSQL - ltree

Innentől kezdve, ha ez rendben van, egy lekérdezéssel le tudsz kérni teljes részfákat. Ha van ltree-d (tehát tudsz pl. kategória + szint szerint rendezni), akkor egy sima egymásba ágyazott listát elő tudsz állítani a rekordok beolvasása közben. Ha nincs, akkor behúzod a teljes adathalmazt, a memóriában előállítod a fát, és bejárod. PHP-nál nagyjából adja magát a "gyerekek" reprezentáció, vagyis minden nem-leaf node-ra tárolod egy tömbben a gyerekeinek az azonosítóját.

Ha mindenképp össze akarod kötni az SPL-es iterátorokkal, akkor: http://php.net/manual/en/class.recursiveiterator.php

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Saját rekurzív függvény/eljárás SQL-ben ami a kívánt html outputtal tér vissza. Ezzel elkerülöd a PHP-ból történő újabb és újabb SQL hívásokat, illetve a meglévő db struktúrát sem kell átvariálni.