[PHP] Hierarchisch menu werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Ik heb al tig keer een hierarchisch menu gemaakt in php en ook zelfs met dezelfde soort arrays als inputdata, maar dit keer gaat er iets fout en ik snap totaal niet wat.

Ik heb een input array als volgt:
code:
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
[27] => Array
        (
            [id] => 27
            [name] => Bouw- en Milieuzaken
            [nr] => 1
            [parent] => 1
            [function] => -1
            [type] => Thema
        )

[532] => Array
        (
            [id] => 532
            [name] => Bouwvergunning
            [nr] => 1.1
            [parent] => 27
            [function] => 15
            [type] => Hoofdproces
        )

[533] => Array
        (
            [id] => 533
            [name] => Bouwaanvragen
            [nr] => 1.1.1
            [parent] => 532
            [function] => 12
            [type] => Proces
        )
etc....


Ik weet zeker dat de hele array klopt, daar zitten echt geen fouten in aangezien ik hem vaker gebruik.
Mijn PHP functie ziet er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
function printIconTree($icons,$pid,$level) {
        foreach($icons as $icon) {
            if($icon['parent']==$pid) {
                echo $level." - ".$icon['nr']." - ".$icon['name']."<br>";
                printIconTree($icons, $icon['id'],$level++);
            }
        }
    }

Ik echo $level ook om debugredenen. Wat ik nu krijg echter als output is het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0 - 1 - Bouw- en Milieuzaken
0 - 1.1 - Bouwvergunning
0 - 1.1.1 - Bouwaanvragen
0 - 1.1.1.1 - Bouwaanvraag
1 - 1.1.1.2 - Beoordelen bouwaanvraag
2 - 1.1.1.3 - Is er een schetsplan aanwezig?
3 - 1.1.1.4 - Conform schetsplan?
4 - 1.1.1.5 - Ontvangstbevestiging versturen en publiceren
5 - 1.1.1.6 - ontvangstbevestiging
.....etc etc etc.....
14 - 1.1.1.15 - Procedure opstarten
15 - 1.1.1.16 - Ontvangsbevestiging sturen en publiceren
16 - 1.1.1.17 - Ontvangstbevestiging
17 - 1.1.1.18 - Toetsingsprocedure
1 - 1.1.2 - Toetsingsprocedure
1 - 1.1.2.1 - Bouwplan
2 - 1.1.2.2 - Ontvankelijkheid toetsen
3 - 1.1.2.3 - Gegevens voldoende?
4 - 1.1.2.4 - Toetsen bouwplan a.d.h.v. bestemminsplan
5 - 1.1.2.5 - Conform bestemmingsplan


Ik roep de functie eerst aan met printIconTree($icons, 1, 0) en zoals je ziet lopen de levels constant op terwijl de eerste 4 op 0 blijven.
Wat gaat hier fout??? Ik kom er echt niet meer op.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Nu online
hoewel ik zo snel niet zie hoe alles in elkaar zit, zou ik eens kijken naar in plaats van:
code:
1
printIconTree($icons, $icon['id'],$level++);
dit doen:
code:
1
printIconTree($icons, $icon['id'],$level+1);
zie laatste argument, $level++ zorgt er misschien voor dat de variabele zelf óók met 1 word opgehoogd, in plaats van de waarde die je aan de functie meegeeft? Wat er dan eigenlijk staat is:
code:
1
printIconTree($icons, $icon['id'],$level = $level+1);

[ Voor 11% gewijzigd door OnTracK op 26-02-2007 19:38 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Verrek!
Het werkt om +1 te gebruiken :D
Hartstikke bedankt.

In PHP4 werkte de $level++ wel goed, maar nu in PHP5 niet?

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je kunt ++$level proberen. Maar ja, dit soort fratsen is altijd heel erg gevoelig, wanneer die variabele wordt opgehoogd. Wat ik me meen te herinneren van bijv. C is dat daar zulke ook nog eens per compiler kunnen verschillen.

"$level + 1" is dan altijd duidelijk.

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


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Grijze Vos schreef op maandag 26 februari 2007 @ 20:00:
Je kunt ++$level proberen. Maar ja, dit soort fratsen is altijd heel erg gevoelig, wanneer die variabele wordt opgehoogd. Wat ik me meen te herinneren van bijv. C is dat daar zulke ook nog eens per compiler kunnen verschillen.

"$level + 1" is dan altijd duidelijk.
Dat is pre increcement en post increcement.

PHP:
1
2
3
4
5
6
$var = 5;
print $var++;
//geeft 5
//$var is NU 6
print ++$var;
//geeft 7, want het is pre (ervoor)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 13:26

JWolters

Killing Me Killing You

mogelijk dat het dan ook zo wel werkt
code:
1
printIconTree($icons, $icon['id'], ++$level);


Argumenten worden default 'by value' meegegeven in PHP4 en PHP5: http://www.php.net/manual/en/functions.arguments.php.

En http://www.php.net/manual...e.operators.increment.php verteld alles over ++.

Waarom gebruik je een id als de key altijd hetzelfde is?

Time is my only fear, an enemy of Sand


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Ik gebruik een ID omdat die verwijst naar een ander bestand genaamd <ID>.html :)
Maar bedankt voor alle hulp.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

JWolters schreef op maandag 26 februari 2007 @ 20:08:
mogelijk dat het dan ook zo wel werkt
code:
1
printIconTree($icons, $icon['id'], ++$level);


Argumenten worden default 'by value' meegegeven in PHP4 en PHP5: http://www.php.net/manual/en/functions.arguments.php.
Argumenten worden ALTIJD by value meegegeven, tenzij er een & voor staat (PHP) of ByReference oid (VB)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • HurrI
  • Registratie: Maart 2001
  • Laatst online: 08-05 13:08

HurrI

No fear... I is here

Snakiej schreef op maandag 26 februari 2007 @ 23:03:
[...]
Argumenten worden ALTIJD by value meegegeven, tenzij er een & voor staat (PHP) of ByReference oid (VB)
Enneuh.. objecten / array's dan? Dat is een verschil tussen PHP4 en PHP5. Bij 4 gingen array's / objecten default by value en in 5 gaat dat by reference.

If it's just us, it seems like an awful waste of space


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
Ik moet zeggen dat ik die constructie met die array niet echt mooi vind, ik zou eerder iets als het volgende doen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Menu {
private $id, $name, $children;
public function Menu($id, $name, $children = array()) {
  $this->id = $id; $this->name = $name; $this->children = $children;
}
public function getName() { return $this->name; }
public function getChildren() { return $this->children; }
}

$menus = array(
  new Menu(1, "Bouw- en Milieuzaken", array(
    new Menu(2, "Bouwvergunning", array(
      new Menu(3, "Bouwaanvraag"),
      new Menu(4, "Beoordelen bouwaanvraag"),
      //etc
    )),
    //etc
  )),
  //etc
);

Op deze manier zijn de kinderen veel gemakkelijk op te vragen.

Dat nummer (1.1.1.2 oid) kun je gemakkelijk zelf genereren.

Voorbeeldje om de menu's vervolgens te printen:
PHP:
1
2
3
4
5
6
7
8
9
10
function printMenus($menus, $path = "") {
  $i = 1;
  foreach($menus as $menu) {
    $subpath = $path ? sprintf("%s.%s", $path, $i) : $i;
    printf("%s - %s<br />", $subpath, $menu->getName());
    if(count($menu->getChildren()))
      printMenus($menu->getChildren(), $subpath);
    $i++;
  }
}

[ Voor 38% gewijzigd door robbert op 26-02-2007 23:36 ]


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Nou, ik gebruik gewoon een array, want:
- ik gebruik die voor nog veel meer dingen in de php behalve het menu
- ik de nummers juist niet zelf mag verzinnen/afleiden. Waarom programmeren als ze al bestaan?

Wat ik wel kan doen is een methode schrijven die een object maakt zoals jij laat zien. Wellicht dat ik dat later doe. Dat is namelijk wel iets makkelijker.

:)

[ Voor 26% gewijzigd door armageddon_2k1 op 26-02-2007 23:25 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
armageddon_2k1 schreef op maandag 26 februari 2007 @ 23:25:
- ik de nummers juist niet zelf mag verzinnen/afleiden. Waarom programmeren als ze al bestaan?
Kan er dan iets bestaan als 1.1.2 waarop volgt 1.1.4? Lijkt me toch niet? Als ze altijd mooi op elkaar volgen dan is het toch veel makkelijk om ze af te leiden?
Het grote voordeel is dat het typwerk scheelt, dat typwerk zorgt alleen maar voor fouten die een computer niet maakt.

[ Voor 13% gewijzigd door robbert op 26-02-2007 23:37 ]


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Misschien wil je ook kijken naar Composite Pattern en daarbij zou ik de nummers gewoon lekker laten genereren. Het punt is, als je een menu item bijvoorbeeld verwijdert, zou je bij wijze van spreken al die nummers handmatig aan moeten passen... als je ze laat slim laat genereren niet, en dat kan vrij eenvoudig icm composite pattern.

[ Voor 14% gewijzigd door prototype op 27-02-2007 00:30 ]


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
Mijn idee boven is toch van het composite pattern? Menu kan dan zowel de composite (indien het kinderen heeft) zijn als de leaf (als het geen kinderen heeft).

[ Voor 9% gewijzigd door robbert op 27-02-2007 00:59 ]


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

robbert schreef op dinsdag 27 februari 2007 @ 00:58:
[...]

Mijn idee boven is toch van het composite pattern? Menu kan dan zowel de composite (indien het kinderen heeft) zijn als de leaf (als het geen kinderen heeft).
Nee, jouw menu's zijn immutable nadat ze geinstantieerd zijn, i.e. geen children kunnen ge-add worden of verwijderd worden. Belangrijk verschil, en daarbij maak jij geen expliciet onderscheid tussen een component, composiet en leaf.

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
robbert schreef op maandag 26 februari 2007 @ 23:30:
[...]

Kan er dan iets bestaan als 1.1.2 waarop volgt 1.1.4? Lijkt me toch niet? Als ze altijd mooi op elkaar volgen dan is het toch veel makkelijk om ze af te leiden?
Het grote voordeel is dat het typwerk scheelt, dat typwerk zorgt alleen maar voor fouten die een computer niet maakt.
Nee, maar er komt nog meer data in de array, namelijk een id waarop ie zou moeten volgen. Het worden op gegeven moment namelijk flows. De data is gegenereerd door een programma, die het vervolgens output in een csv formaat. Dat lees ik in :) en daar doe ik vervolgens het e.e.a. mee.
Het programma geeft zelf die nummers al. Kleine moeite om ze dan niet in te lezen.

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1