Hallo!
Ik zit met een programmeer-technisch probleem. Alhoewel... het is niet eens echt een probleem. Het lijkt echter dat mijn gevonden oplossing nou niet direct de meest efficiënte is ... vandaar.
Om enige achter-grond te geven, ik heb een MySQL tabel met 'mappen', vergelijkbaar met een hierarchie van mappen die je ook in windows zou terugvinden. Hiervoor gebruik ik de volgende indeling:
Nu wil ik graag een HTML select-box maken, waarin de hierarchie van de mappen duidelijk naar voren komt. Dat zou dus ongeveer een indeling krijgen als volgt:
Nu is de eerste stap, dat ik alle mappen uit de database haal. Met mijn standaard set van Controller-class en Entity-class levert dat een array op met de FOLDER objecten. Ieder folder object heeft de member-vars, zoals die in de table voorkomen.
Nog even, alhoewel wellicht overbodig:
Nu moet ik dus de mappen gaan sorteren, zodat ze in de juiste hierarchie terechtkomen en er - afhankelijk van het niveau van de map - een prefix voor de naam komt (--).
In mijn huidige oplossing, heb ik daarvoor een recursieve functie die begint bij de mappen waarvoor geldt parentID = 0, dit zijn immers de hoofdmappen. Vervolgens worden steeds alle submappen van de betreffende hoofdmap hieronder toegevoegd, waarin per map wordt bekeken of deze eventueel ook weer submappen heeft.
Dit lijkt allemaal nog redelijk 'straight forward'. Nu komt het echter. Wanneer ik ga kijken of een map in aanmerking komt als submap van de betreffende map, ga ik in een foreach() loop steeds door alle mappen heen. Dat wil zeggen dat er - volgens mij - veel tijd verloren gaat in het doorlopen van de hele array. Die functie ziet er ongeveer zo uit:
Dit lijkt dus niet de meest efficiënte functie, want steeds worden weer alle mappen doorlopen op zoek naar de juiste mappen.
Mijn grote vraag is dus: Kan dit handiger?
Overigens heb ik er in dit voorbeeld voor gekozen om te werken met slechts één MySQL query, dat leek me sneller dat steeds, afhankelijk van de parentID een nieuwe query uit te voeren. Klopt dat?
Ik hoop dat iemand hier zijn ervaring over kan laten spreken.
Alvast bedankt!
Robert-Jan.
Ik zit met een programmeer-technisch probleem. Alhoewel... het is niet eens echt een probleem. Het lijkt echter dat mijn gevonden oplossing nou niet direct de meest efficiënte is ... vandaar.
Om enige achter-grond te geven, ik heb een MySQL tabel met 'mappen', vergelijkbaar met een hierarchie van mappen die je ook in windows zou terugvinden. Hiervoor gebruik ik de volgende indeling:
code:
1
2
3
| folderID (INT) PRI parentID (INT) name |
Nu wil ik graag een HTML select-box maken, waarin de hierarchie van de mappen duidelijk naar voren komt. Dat zou dus ongeveer een indeling krijgen als volgt:
code:
1
2
3
4
5
6
7
| HOOFDMAP -- SUBMAP1 ---- SUBSUBMAP1 -- SUBMAP2 ---- SUBSUBMAP2 ------ SUBSUBSUBMAP2 etc. |
Nu is de eerste stap, dat ik alle mappen uit de database haal. Met mijn standaard set van Controller-class en Entity-class levert dat een array op met de FOLDER objecten. Ieder folder object heeft de member-vars, zoals die in de table voorkomen.
Nog even, alhoewel wellicht overbodig:
code:
1
2
3
4
5
| class Folder { var $folderID = 0; var $parentID = 0; var $name = ""; } |
Nu moet ik dus de mappen gaan sorteren, zodat ze in de juiste hierarchie terechtkomen en er - afhankelijk van het niveau van de map - een prefix voor de naam komt (--).
In mijn huidige oplossing, heb ik daarvoor een recursieve functie die begint bij de mappen waarvoor geldt parentID = 0, dit zijn immers de hoofdmappen. Vervolgens worden steeds alle submappen van de betreffende hoofdmap hieronder toegevoegd, waarin per map wordt bekeken of deze eventueel ook weer submappen heeft.
Dit lijkt allemaal nog redelijk 'straight forward'. Nu komt het echter. Wanneer ik ga kijken of een map in aanmerking komt als submap van de betreffende map, ga ik in een foreach() loop steeds door alle mappen heen. Dat wil zeggen dat er - volgens mij - veel tijd verloren gaat in het doorlopen van de hele array. Die functie ziet er ongeveer zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| function getChildren ( $given_parentID, $all_folders ) { $temp_array = Array(); foreach ( $all_folders as $folder ) { if ( $folder->parentID == $given_parentID ) { $temp_array[] = $folder; } } return $temp_array; } // end of function getChildren() |
Dit lijkt dus niet de meest efficiënte functie, want steeds worden weer alle mappen doorlopen op zoek naar de juiste mappen.
Mijn grote vraag is dus: Kan dit handiger?
Overigens heb ik er in dit voorbeeld voor gekozen om te werken met slechts één MySQL query, dat leek me sneller dat steeds, afhankelijk van de parentID een nieuwe query uit te voeren. Klopt dat?
Ik hoop dat iemand hier zijn ervaring over kan laten spreken.
Alvast bedankt!
Robert-Jan.