Adatbázisból tömbbe hogy tudok hatékonyan menüszerkezetet betenni?
Üdv,
adatbázisból szeretnék menüt rendezni többdimenziós tömbbe.
Erre várnék 5leteket. Jó volna DB-ből már rendezve lekérni és aztán csak behúzni tömbbe.
prog.hu-n volt egy jó kód, de nem tökéletes: [link]
Nálam is a másodlagos menük már rossz helyre kerülnek.
Tábla: ID, nev, szulo, sorrend
Ha a menü főmenü, akkor a parent értéke nulla.
Gondolkodtam azon, h valami rekurzív eljárást írok, ami egyesével végigmegy a lekérdezés eredményén, majd egy tömbbe elkezdi bepakolni úgy, hogy ID alapján. De mivel bármilyen sorrend lehet a feldolgozásban, így nem tudni, h ki milyen mélységbe kerül. Azaz minden vizsgált menüpontnál a már elhelyezett fán végig kéne mennem. Ez nem tűnik túl hatékonynak. Köszönöm annak, aki segít ebben.
Értem én, hogy gőzgép, de mi hajtja?
Konkrétumok segítenének igazán.
Tehát akkor nem is 2d tömb kell neked, hanem fa....
sztem simán kérd le (szulo, sorrend)- sorrendben, ebből könnyen építhetsz fát.
Gondolom itt nem millió rekordokról van szó, hisz akkor le sem kérnéd egyben. Illetve feltételezhetjük, hogy a szülő ID-ja kisebb mint a gyereké, ugye?
Algoritmus: Lekéred a megadott sorrendben.
Változók:
OsszesMenuElem, tipusa: valamilyen set (php-ban ez gondolom csak sima array)
OssesMenuElem[0] = Új MenuElem (ez a gyökér)
Ciklus a lekért listán:
Szülő = OszsesMenuElem[AktuálisMenuElem.Szülő] // ha feltételezzük, hogy a szülő ID-ja kisebb, akkor már létezik a szülő
Szülő.Almenük.Add(AktuálisMenuElem)
OsszesMenuElem.Add(AktuálisMenuElem.Id, AktuálisMenuElem)
Ciklus vége
Nyilván lehet szebben, máshogy... pláne nagyo nsok menu elem esetén, de akkor már a lekérés (és talán az adatbázis séma) sem úgy lenne ahogy írtad
#16 Ha bevezetsz némi redundanciát az adatbázisszerkezetedbe, név szerint eltárolod minden elemhez, hogy milyen mélységi szinten van, akkor könnyedén tudod mélységi sorrendben lekérni a menüelemeket (ennek a hátránya értelemszerűen az adatbázisban levő redundancia, ami plusz tárhelyfoglalást, és odafigyelést igényel az adatok frissítésekor). Ez ilyen showbiznisz, választhatsz, hogy a lekérdezés/lekért adatok feldolgozása legyen gyors, vagy az adatbázis karbantartása. Mivel menürendszerről van szó, ami valószínűleg nem változik túl gyakran, ezért ez vállalható dolog.
Ha mélységi sorrendben tudod lekérni az elemeket, az számos előnnyel jár:
- Sorfoyltonosan tudod feldolgozni a menüelemeket, mivel minden elemnek garantáltan feldolgoztad már a szülőjét
- Tetszőleges mélységig tudod lekérni a menüelemeket, így ha csak az első 2 szintet akarod lekérni, könnyedén megoldható
- Gyors és egyszerű marad az adatok lekérdezése, nem kell rekurziót, sem csavaros sql-t írogatni a célod eléréséhez.
Innentől már elég triviális a dolog, szép sorban feldolgozod a rekordokat, először a 0. szint elemeit, aztán az 1. szint elemeit, és így tovább. Az egyetlen amire oda kell figyelni, hogy ha egy meglévő menüelemnek változik a szülője, akkor azt, és az összes alatta levő menüelemet frissíteni kell az új mélységi értékkel. Ezért mondtam, hogy vagy a lekérdezésen, vagy a karbantartáson spórolsz, mindkettőn nehéz.
""Illetve feltételezhetjük, hogy a szülő ID-ja kisebb mint a gyereké, ugye?" - Nem. Hiszen bármilyen variációt ki lehet alakítani."
Jó, akkor sincs nagy gond, az algorutmusom annyit változik, hogy ha még nincs meg a szülő, akkor kihagyod azt az elemet... és az egészet ciklusban addig ismétled amíg mind meg nem lesz...
Nem írtad korábban, hogy ez egy dinamukusan átrendezhető menü, ezért éltem a feltételezéssel, hiszen logkikus lett volna ha úgy van.... de ha dinamikus, akkor is megoldható hogy az áthelyezésnél (amikor az új szülő ID-ja nagyobb mint az áthelyezett elem), hogy újra létrehozod a struktúrát és törlöd a régit.. ezzel biztosítva, hgoy a gyerek ID-ja nagyobb legyen.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!