Beste tweakers,
Momenteel sta ik voor een lastige opgave (althans, voor mij). Namelijk;
Ik heb een tweetal tabellen (zie onderstaand voorbeeld):
Tabel: Levels
Tabel: Items
Deze twee tabellen hebben, zoals je kan zien een relatie door middel van het 'level_id'.
Nu probeer ik in PHP hier een hierarchische (tree) structuur uit te krijgen, met als voorbeeld:
De bovenstaande structuur heb ik handmatig opgezet, maar ik wil dit uiteraard automatisch laten verlopen op basis van de gegevens uit de database.
Het moeilijke voor mij zit 'm in het geval dat de tabel 'items' bepaald wat getoond moet worden. M.a.w.; op basis van een filter / zoekfunctie op de website wordt gezocht in de tabel 'items' en zullen de bijbehorende niveaus opgenomen moeten worden. Dus niet alleen het directe niveau waar het betreffende item ondervalt, maar ook de daarbovenliggende niveaus.
Ik heb het geprobeerd op te lossen met twee aparte sql queries, waarbij de eerste alle 'levels' ophaalt en de tweede alle items. Een tweede mogelijkheid is het maken van een recursieve functie, waarbij de 'tree' wordt opgebouwd (zie onderstaande functie). Dit werkt niet goed wanneer ik wil zoeken op specifieke items, waarbij ook alle bovenliggende niveaus zichtbaar moeten zijn.
Ik ben mij ervan bewust dat het allemaal wat vaag omschreven is, maar kunnen jullie mij in de goede richting helpen? Kant-en-klare code is niet nodig, maar ik loop momenteel vast en kom niet echt verder.
Alvast bedankt.
Momenteel sta ik voor een lastige opgave (althans, voor mij). Namelijk;
Ik heb een tweetal tabellen (zie onderstaand voorbeeld):
Tabel: Levels
level_id | level_parent_id | level_name |
0 | null | Hoofdcategorie |
1 | 0 | Subcategorie 1 |
2 | 0 | Subcategorie 2 |
3 | 2 | Subcategorie 2 - 1 |
4 | 2 | Subcategorie 2 - 2 |
Tabel: Items
item_id | item_name | level_id |
1 | Naam 1 | 0 |
2 | Naam 2 | 3 |
3 | Naam 3 | 4 |
4 | Naam 4 | 1 |
Deze twee tabellen hebben, zoals je kan zien een relatie door middel van het 'level_id'.
Nu probeer ik in PHP hier een hierarchische (tree) structuur uit te krijgen, met als voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| <?php array( 0 => array( 'level_name' => 'Hoofdcategorie', 'items' => array(), // GEEN DIRECTE ONDERDERLIGGENDE ITEMS 'children' => array( 0 => array( 'level_name' => 'Subcategorie 1', 'items' => array( 0 => array( 'item_id' => 4, 'item_name' => 'Naam 4' ) ) ), 1 => array( 'level_name' => 'Subcategorie 2', 'items' => array(), // GEEN DIRECTE ONDERDERLIGGENDE ITEMS 'children' => array( 0 => array( 'level_name' => 'Subcategorie 2 - 1', 'items' => array( 0 => array( 'item_id' => 2, 'item_name' => 'Naam 2' ) ) ), 1 => array( 'level_name' => 'Subcategorie 2 - 2', 'items' => array( 0 => array( 'item_id' => 3, 'item_name' => 'Naam 3' ) ) ) ) ) ) ) ); ?> |
De bovenstaande structuur heb ik handmatig opgezet, maar ik wil dit uiteraard automatisch laten verlopen op basis van de gegevens uit de database.
Het moeilijke voor mij zit 'm in het geval dat de tabel 'items' bepaald wat getoond moet worden. M.a.w.; op basis van een filter / zoekfunctie op de website wordt gezocht in de tabel 'items' en zullen de bijbehorende niveaus opgenomen moeten worden. Dus niet alleen het directe niveau waar het betreffende item ondervalt, maar ook de daarbovenliggende niveaus.
Ik heb het geprobeerd op te lossen met twee aparte sql queries, waarbij de eerste alle 'levels' ophaalt en de tweede alle items. Een tweede mogelijkheid is het maken van een recursieve functie, waarbij de 'tree' wordt opgebouwd (zie onderstaande functie). Dit werkt niet goed wanneer ik wil zoeken op specifieke items, waarbij ook alle bovenliggende niveaus zichtbaar moeten zijn.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <?php function buildTree(array &$elements, $parentId = 0) { $branch = array(); foreach ($elements as $element) { if ($element['level_parent_id'] == $parentId) { $children = buildTree($elements, $element['level_id']); if ($children) { $element['children'] = $children; } $branch[$element['level_id']] = $element; unset($elements[$element['level_id']]); } } return $branch; } ?> |
Ik ben mij ervan bewust dat het allemaal wat vaag omschreven is, maar kunnen jullie mij in de goede richting helpen? Kant-en-klare code is niet nodig, maar ik loop momenteel vast en kom niet echt verder.
Alvast bedankt.