[PHP] Navigatie menu samenstellen uit array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Na wat prullen heb ik het volgende (vereenvoudigd):
PHP:
1
2
3
4
5
6
7
8
$navitems[0]['name'] = 'Home';
$navitems[1]['name'] = 'Appels';
$navitems[2]['name'] = 'Peren';

for ($i = 0; $i < count($navitems); $i++)
{
  echo $navitems[$i]['name'].'<br>';
}

Dit levert op
HTML:
1
2
3
Home
Appels
Peren

Nu wil ik graag een onderverdeling maken: appels valt uiteen in rood en groen. Met andere woorden: ik zou graag
HTML:
1
2
3
4
5
Home
Appels
  Rood
  Groen
Peren
als output willen hebben.

Op dit moment ben ik zover:
PHP:
1
2
3
4
5
6
7
8
9
10
$navitems[0]['name']    = 'Home';
$navitems[1]['name']    = 'Appels';
$navitems[1][0]['name'] = 'Rood';
$navitems[1][0]['name'] = 'Groen';
$navitems[2]['name']    = 'Peren';

for ($i = 0; $i < count($navitems); $i++)
{
  echo $navitems[$i]['name'].'<br>';
}

maar dit werkt (natuurlijk) niet. Eigenlijk heb ik nu twee vragen:
• heb ik die $navitems array zo goed opgebouwd?
• wie helpt mij op weg met die for-loop?

P.S - ik weet dat het gebruikelijk is om een navigatie in een database op te slaan, maar waar deze code moet komen te draaien heb ik geen beschikking over een database. Vandaar hard-coded. Gelukkig hoeft het menu nooit meer dan twee niveau's te hebben :)

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


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Je kunt per item toch ook het niveau opslaan?

Dus:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$navitems[0]['name']   = 'Home';
$navitems[0]['level']  = '0';
$navitems[1]['name']   = 'Appels';
$navitems[1]['level']  = '0';
$navitems[2]['name']   = 'Rood';
$navitems[2]['level']  = '1';
$navitems[3]['name']   = 'Groen';
$navitems[3]['level']  = '1';
$navitems[4]['name']   = 'Peren';
$navitems[4]['level']  = '0';

for ($i = 0; $i < count($navitems); $i++) {
  if ($navitems[$i]['level']=="1") {
    echo "&nbsp;&nbsp;&nbsp;";
  }
  echo $navitems[$i]['name'].'<br>';
}

[ Voor 73% gewijzigd door Room42 op 04-10-2004 01:03 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Reveller schreef op 04 oktober 2004 @ 00:45:
• heb ik die $navitems array zo goed opgebouwd?
Nee, je slaat 2x een andere waarde op (groen en rood) in dezelfde variabele. Maar dat zal wel een tikfout zijn. ;)
Reveller schreef op 04 oktober 2004 @ 00:45:
• wie helpt mij op weg met die for-loop?
Ik denk dat je beter even de search na kan slaan om wat recursieve algoritmes te vinden. Dit onderwerp is al vrij vaak en uitvoerig voorbij gekomen namelijk. :)

Met een for-constructie zal het zoiets worden:
PHP:
1
2
3
4
5
6
7
for ($i = 0; $i < count($navitems); $i++) {
  echo $navitems[$i]['name'].'<br>';
  if count($navitems[$i]) != 0) {
    for ($j = 0; $j < count($navitems[$i]); $j++) {
      echo '- '.$navitems[$i][$j]['name'].'<br>';
  }
}
Room42 schreef op 04 oktober 2004 @ 00:57:
PHP:
1
2
3
4
5
6
$navitems[1]['name']   = 'Appels';
$navitems[1]['level']  = '0';
$navitems[1]['name']   = 'Rood';
$navitems[1]['level']  = '1';
$navitems[1]['name']   = 'Groen';
$navitems[1]['level']  = '1';
Denk eens goed na. Wat denk je dat dit doet...?

[ Voor 28% gewijzigd door NMe op 04-10-2004 01:01 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Och het is laat, je moet ff die eentjes aanpassen naar de juiste getallen. Sorry hoor.

Aangepast O-)

[ Voor 10% gewijzigd door Room42 op 04-10-2004 01:04 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

Verwijderd

en als je nou alleen de bovenliggende menuitems opneemt ipv het niveau....
dan laat je een functie lopen over de menuitems, dit doe je recursief voor alle menu items die het betreffende id als bovenliggend menu item hebben en je komt een heel eind denk ik...

recursie is sowieso nodig, tenzij je jezelf wil binden aan een maximale menu diepte...dan is t ook wel anders op te lossen, maar t mooist is natuurlijk als je een oneindig diep menu kan maken...

Acties:
  • 0 Henk 'm!

Verwijderd

Hap-klaar:

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
<?php

$navitems[0]['name']        = 'Home';
$navitems[0]['options']     = array('home' => 'home.html');
$navitems[1]['name']        = 'Appels';
$navitems[1]['options']     = array('groen' => 'groen.html', 'rood' => 'rood.html');

foreach($navitems AS $key => $value)
{

    $mainCatergoryName = $value['name'];
    $subCatArray = $value['options'];
    $header = 0;

    foreach($subCatArray AS $subCat => $href)
    {

        if(count($subCatArray) > 1 AND $header == 0)
        {

            $header = 1;
            echo $mainCatergoryName . '<br>';

        }

        if($header == 1)
        {

            echo '- ';

        }
        
        echo '<a href="'.$href.'">' . $subCat . '</a><br>';

    }

}


?>


Is vrij eenvoudige en foutgevoelige en simplistische code, maar dat zoek je maar lekker zelf uit. En nu, het warme bed opzoeken.

/me zet voldaan zijn peecee-tje uit over enkele ogenblikken :)

[ Voor 31% gewijzigd door Verwijderd op 04-10-2004 01:34 ]


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
naja zoiets wellicht, niet de meest efficiente code, maar voor een simpel menutje... :

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
<?
$navitems[1] = Array( parent=>0, name=>'Home' );
$navitems[2] = Array( parent=>0, name=>'Appels' );
$navitems[3] = Array( parent=>2, name=>'Rood' );
$navitems[4] = Array( parent=>2, name=>'Groen' );
$navitems[5] = Array( parent=>0, name=>'Peren' );

function buildMenu($menuItems, $curItem, $depth) {
    
    $identToken = "&nbsp;";
    $tabWidth = 4;
    
    foreach ( $menuItems as $itemKey=>$item ) 
    { 
        if ($item['parent']==$curItem) 
        {
            echo str_repeat($identToken, $tabWidth * $depth) . $item['name']  . "<br>\n";
            buildMenu($menuItems, $itemKey, $depth + 1);
        }   
    }
}

buildMenu($navitems, 0, 0);
?>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 04 oktober 2004 @ 01:30:
recursie is sowieso nodig, tenzij je jezelf wil binden aan een maximale menu diepte...dan is t ook wel anders op te lossen, maar t mooist is natuurlijk als je een oneindig diep menu kan maken...
offtopic:
Ook zonder recursie kun je prima een oneindig diep menu maken hoor. Al ben ik het met je eens dat recursie mooier en waarschijnlijk efficïenter is in dit geval.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

offtopic:
Ook zonder recursie kun je prima een oneindig diep menu maken hoor. Al ben ik het met je eens dat recursie mooier en waarschijnlijk efficïenter is in dit geval.
In principe is het zo dat wanneer je een oneindige diepte wilt creeeren je simpelweg altijd met recursie moet werken. Waarschijnlijk doel je op het idee met twee functies die elkaar aanroepen o.i.d, maar dit is nog steeds een vorm van recursie. Verras me met een voorbeeld.

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Een voorbeeld van een directory tree. Ik gebruik deze zelf om via PHP en JavaScript een complete directory structuur weer te geven.

Het JavaScript gebeuren ziet er voor een deel zo uit:
code:
1
2
3
4
5
6
d.add(1,0,'dirnaam','url');
d.add(2,1,'dirnaam','url');
d.add(3,2,'dirnaam','url');
d.add(4,3,'dirnaam','url');
d.add(5,1,'dirnaam','url');
d.add(6,0,'dirnaam','url');


Je ziet hier 1 t/m6, dit zijn als het ware de directory IDs. Deze wordt voor elke dir dus met 1 verhoogd. Het tweede cijfer geeft de parent van de betreffende directory aan.

Als je dus 2 hoofd menu items(1 en 2) hebt met elk een aantal subitems dan hebben de subitems als parent dus 1 of 2. Op deze manier kan je dus heel eenvoudig een oneindig aantal submenus maken zonder dat je moeilijk hoeft te doen met het 'netjes' uittikken van array's. Je plakt er gewoon een nieuw submenu aan met zn eigen ID en geeft op wat zijn parent is.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 04 oktober 2004 @ 10:55:
[...]


In principe is het zo dat wanneer je een oneindige diepte wilt creeeren je simpelweg altijd met recursie moet werken. Waarschijnlijk doel je op het idee met twee functies die elkaar aanroepen o.i.d, maar dit is nog steeds een vorm van recursie. Verras me met een voorbeeld.
Elke recursieve functie kan omgeschreven worden naar een iteratieve functie. Op zijn simpelst gebruik je een while-loopje en een stack.

En in gecompileerde talen is dat nog eens efficiënter dan een recursief algoritme ook!
Pagina: 1