Eerder vandaag postte ik het topic [rml][ PHP/MySQL] Zit vast met statisch uitklap menu[/rml]. Inmiddels heb ik voormijn probleem daar een oplossing gevonden; alleen krijg ik de code niet geheel aan de praat. Dit komt vooral omdat ik nog niet goed thuis ben in het werken met array's. Zou iemand mij wat pointers kunnen geven?
Ik heb de volgende tabel genaamd 'tree':

En een pagina genaamd 'pagina.php'. Aan deze pagina wordt de variabele 'id' mee gegeven, bijvoorbeeld 'pagina.php?id=9'. Het doel is om een navigatieboom op de pagina weer te geven, waarin bijvoorbeeld 'cool cms' (node_id = 7) als gekozen wordt weergegeven - als volgt:
De code die ik heb geschreven:
Bovenstaan de code werkt alleen niet, en van een aantal problemen ben ik me bewust. Maar ik weet bijvoorbeeld niet of en hoe ik een array als input variabele voor een functie kan gebruiken. Kan iemand mij helpen deze code werkende te krijgen - uiteraard met duwtjes in de goede richting. Ik vraag niet om een kant-en-klare oplossing
Ik heb de volgende tabel genaamd 'tree':

En een pagina genaamd 'pagina.php'. Aan deze pagina wordt de variabele 'id' mee gegeven, bijvoorbeeld 'pagina.php?id=9'. Het doel is om een navigatieboom op de pagina weer te geven, waarin bijvoorbeeld 'cool cms' (node_id = 7) als gekozen wordt weergegeven - als volgt:
HTML:
1
2
3
4
5
6
7
8
| root
odisys
producten
> content management
shopping cart
diensten
weblog
contact |
De code die ik heb geschreven:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
| // Creeer de tabel CREATE TABLE tree ( node_id int(3) NOT NULL auto_increment, node_pid int(3) NOT NULL default '0', node_name varchar(150) NOT NULL default '', PRIMARY KEY (node_id) ) TYPE=MyISAM; // Lees id uit querystring: $get_id if (isset ($_GET['id'])) { $get_id = $_GET['id']; } else { $get_id = 1; } // Enkele variabelen global $arr_path; $int_path_size = sizeof($arr_path); // Vraag het pad van $get_id naar de root van de tree op en stop in array function get_path($node) { $qry_node = "SELECT node_pid, node_name FROM tree WHERE node_id = '" .$node. "'"; $res_node = db_query($qry_node, 0, 0); $row_node = db_fetch_array($res_node); $arr_path = array(); if ($row_node['node_pid']!='0') { $arr_path[] = $row_node['node_pid']; $arr_path = array_merge(get_path($row_node['node_pid']), $arr_path); } return $arr_path; } /* Stel de navigatie samen, uitgaande van de array hierboven. In de array liggen de id's opgeslagen van de nodes die naar de root van de tree leiden. Ik begin vooraan in de array (arr_path[0] is altijd 1 (want: node_id van de root)) en haal van deze id de kinderen op (kinderen van 'root' zijn 'odisys', 'producten' etc.). Als ik hierbij op een kind stuit wiens node_id gelijk is aan arr_path[1], haal ik de kinderen van die node weer op. Etc. Op die manier moet ik alle relevante informatie kunnen verzamelen om bovenstaande tree te kunnen maken */ function get_nav($arr_path, $level) { for ($i = 0; $i < $int_path_size; $i++) { $qry_nodes = "SELECT node_id, node_name FROM tree WHERE node_pid = '" .$arr_path[$i]. "'"; $res_nodes = db_query($qry_nodes, 0, 0); $num_nodes = db_num_rows($res_nodes); for ($j = 0; $j < $num_nodes; $j++) { $row_nodes = db_fetch_array($res_nodes); if ($row_nodes['node_id'] == $arr_path[$int_path_size - 1]) { echo str_repeat(' ', $level)." > ".$row_nodes['node_name']."<br>"; } else { echo str_repeat(' ', $level).$row_nodes['node_name']."<br>"; } if ($row_nodes['node_id'] == $arr_path[$i+1]) { get_nav($arr_path[$i+1], $level+1); } } } } |
Bovenstaan de code werkt alleen niet, en van een aantal problemen ben ik me bewust. Maar ik weet bijvoorbeeld niet of en hoe ik een array als input variabele voor een functie kan gebruiken. Kan iemand mij helpen deze code werkende te krijgen - uiteraard met duwtjes in de goede richting. Ik vraag niet om een kant-en-klare oplossing
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."