[PHP] Menu samenstellen

Pagina: 1
Acties:
  • 85 views sinds 30-01-2008

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
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':

Afbeeldingslocatie: http://www.danandan.luna.nl/tabel_tree.gif

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('&nbsp;&nbsp;', $level)." &gt; ".$row_nodes['node_name']."<br>";
            } else {
                echo str_repeat('&nbsp;&nbsp;', $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."


  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 25-05 21:56

Vae Victis

Dark Lord of the Sith

Makkelijkst is dat om recursief te doen. Via een functie die zichzelf aanroept.
Als je zoekt op: [search=menu recursief]
Vind je: [rml]Bosmonster in "[ Php/mysql] recursief tree weergeven *"[/rml]
Als je dat even doorleest moet je er wel uitkomen. ;)

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 22:02
Vae Victis schreef op 09 april 2004 @ 20:54:
Makkelijkst is dat om recursief te doen. Via een functie die zichzelf aanroept.
Als je zoekt op: [search=menu recursief]
Vind je: [rml]Bosmonster in "[ Php/mysql] recursief tree weergeven *"[/rml]
Als je dat even doorleest moet je er wel uitkomen. ;)
Dat doet ie toch al in de fuctie get_nav().

PHP:
1
2
3
4
function get_nav($arr_path, $level) { 
  // in de laaste if statement van die functie
  get_nav($arr_path[$i+1], $level+1); 
}

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 25-05 21:56

Vae Victis

Dark Lord of the Sith

Sybr_E-N schreef op 09 april 2004 @ 20:57:
Dat doet ie toch al in de fuctie get_nav().
Die niet werkt ;)
Nam aan dat hij niet weet wat recursief is, dus niet weet waar op te zoeken.
Lijkt me dat het nu wel op te lossen valt.

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Vae Victis - natuurlijk weet ik wel wat recursief is. Ik heb o.a. de volgende functie (hoort bij hetzelfde systeem als hierboven):
PHP:
1
2
3
4
5
6
7
8
function display_tree($parent, $level) { 
   $result = db_query('SELECT node_id, node_name FROM tree WHERE node_pid = "'.$parent.'";', 0, 0); 

   while ($row = db_fetch_array($result)) { 
       echo str_repeat('&nbsp;&nbsp;',$level).$row['node_name']."<br>"; 
       display_tree($row['node_id'], $level+1); 
   } 
}

Maar het probleem is dat een standaard recursieve functie ALLE nodes uit de tree tabel trekt. Dat is nu juist mijn probleem: ik wil alleen de relevante (lees: die met het pad naar de huidige node te maken hebben en hun zusjes) nodes uit de dbase trekken. En trouwens: get_nav() is ook wel degelijk recursief :Y)

"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."


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Reveller schreef op 09 april 2004 @ 20:44:
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 :+
Duw 1:
code:
1
2
3
4
5
6
7
8
9
10
11
function bewerkarray(&$arr)
{
  // doe iets leuks met het array
  $arr[3] = 100;
}

$test = array(0, 1, 5, 6, 2, 4);
echo "<pre>";
print_r($test);
bewerkarray($test);
print_r($test);


Of, equivalent, maar zonder passing by reference:
code:
1
2
3
4
5
6
7
8
9
10
11
12
function bewerkarray($arr)
{
  // doe iets leuks met het array
  $arr[3] = 100;
  return $arr;
}

$test = array(0, 1, 5, 6, 2, 4);
echo "<pre>";
print_r($test);
$test = bewerkarray($test);
print_r($test);

[ Voor 23% gewijzigd door Grijze Vos op 09-04-2004 21:59 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • mocean
  • Registratie: November 2000
  • Laatst online: 30-03 18:32
Als je alleen de tak wil uitklappen naar de pagina waar je bent, zou ik het in 2 stappen doen.

Eerst een recursive functie die vanaf de pagina het pad naar de root bepaald.

Vervolgens laat je de recursieve functie die het menu maakt, alleen zichzelf aanroepen, als de id ook in het pad ligt wat je eerder hebt bepaald.

Koop of verkoop je webshop: ecquisition.com


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Reveller schreef op 09 april 2004 @ 20:44:
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?
[..]
En dan ga je niet verder in dat topic, Je gaat ook vooral niet in dat topic vertellen dat je de oplossing hebt gevonden, en wat de oplossing precies was.

En bedankt van de mensen die in de toekomst misschien dezelfde probleem hebben die vinden het topic, maar niet de oplossing.

Lekker Sociaal.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1

Dit topic is gesloten.