Ik heb laatst een simpele recursieve functie in PHP geschreven om een balkje te genereren die je absolute locatie op de website aangeeft...
De code werkt nu, maar er is iets dat aan me vreet... Zoals je kunt zien kijkt hij of de Parent (de pagina boven de huidige pagina) niet 'Root' is, dan haalt hij de Parentpagina op uit de db en zet deze als de huidige pagina neer, vervolgens wordt deze aan de lijst toegevoegd en checkt hij dezelfde conditie weer. Is de pagina dan nog steeds geen root, dan wordt de functie opnieuw uitgevoerd.
Dit werkt dus allemaal precies zoals ik het in mijn hoofd had. Echter, je zult ook zien dat ik helemaal onderaan nog de huidige pagina aan het lijstje toevoeg:
De reden dat ik dit niet al in de functie doe, is omdat op de plek waar ik het normaal zou zetten (bij de comment) de code n keer doet renderen (waarbij n het aantal keren is dat de functie draait)...
Bijvoorbeeld: wanneer ik een pagina heb met 3 Parents, wordt de functie 3 keer aangeroepen. Als ik die laatste regel op de plek van de comment zou zetten wordt huidige pagina op het einde 3 keer toegevoegd. Je krijgt dan iets van:
Parent1 >> Parent2 >> Parent 3 >> Huidige PaginaHuidige PaginaHuidige Pagina
Ik vind dit erg vreemd gedrag, want ik ging er vanuit dat de functie afgebroken wordt wanneer de functie opnieuw aangeroepen wordt. Heb al vanalles geprobeerd met } else { en } elseif { maar tot nu toe nog geen succes.
Wie weet wat er hier nou precies aan de hand is, waarom gedraagt PHP zich zo?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function BuildNavigator($Navigator, $Parent, $PageName, $PID){ if($Parent != 'Root'){ $query = mysql_query("SELECT Parent, PageName, PID FROM Content WHERE PageName = '$Parent'"); while($row = mysql_fetch_assoc($query)){ $Parent = $row['Parent']; $TPageName = $row['PageName']; $TPID = $row['PID']; } $Navigator = '<a href="index.php?PID='.$TPID.'">'.$TPageName.'</a> >> ' . $Navigator; if($Parent != 'Root'){ $Navigator = BuildNavigator($Navigator, $Parent, $PageName, $PID); } } return $Navigator; /* Laatste NavLink kan niet hier, wordt dan n keer geparsed... */ } $Navigator = BuildNavigator($Navigator, $Parent, $PageName, $PID); $Navigator = $Navigator . '<a href="index.php?PID='.$PID.'">'.$PageName.'</a>'; |
De code werkt nu, maar er is iets dat aan me vreet... Zoals je kunt zien kijkt hij of de Parent (de pagina boven de huidige pagina) niet 'Root' is, dan haalt hij de Parentpagina op uit de db en zet deze als de huidige pagina neer, vervolgens wordt deze aan de lijst toegevoegd en checkt hij dezelfde conditie weer. Is de pagina dan nog steeds geen root, dan wordt de functie opnieuw uitgevoerd.
Dit werkt dus allemaal precies zoals ik het in mijn hoofd had. Echter, je zult ook zien dat ik helemaal onderaan nog de huidige pagina aan het lijstje toevoeg:
PHP:
1
| $Navigator = $Navigator . '<a href="index.php?PID='.$PID.'">'.$PageName.'</a>'; |
De reden dat ik dit niet al in de functie doe, is omdat op de plek waar ik het normaal zou zetten (bij de comment) de code n keer doet renderen (waarbij n het aantal keren is dat de functie draait)...
Bijvoorbeeld: wanneer ik een pagina heb met 3 Parents, wordt de functie 3 keer aangeroepen. Als ik die laatste regel op de plek van de comment zou zetten wordt huidige pagina op het einde 3 keer toegevoegd. Je krijgt dan iets van:
Parent1 >> Parent2 >> Parent 3 >> Huidige PaginaHuidige PaginaHuidige Pagina
Ik vind dit erg vreemd gedrag, want ik ging er vanuit dat de functie afgebroken wordt wanneer de functie opnieuw aangeroepen wordt. Heb al vanalles geprobeerd met } else { en } elseif { maar tot nu toe nog geen succes.
Wie weet wat er hier nou precies aan de hand is, waarom gedraagt PHP zich zo?
HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m