Recursieve functies (extra)
Hieronder zie je een mooi voorbeeld waar de functie weer opnieuw wordt aangeroepen tot het getal 10 is bereikt. Het is hier dus een alternatief op een loop (itteratie).
function getallen($getal) {
if($getal <= 10){
echo "$getal\n";
getallen($getal+1);
}
}
getallen(1);
Een ander vaak gebruikt voorbeeld is de faculteit van een een natuurlijk getal (https://nl.wikipedia.org/wiki/Faculteit_(wiskunde)).
function faculteit($n)
{
if ($n == 0)
return 1;
return ($n * faculteit($n -1));
}
echo faculteit(10);
Moeilijker voorbeeld
We gaan een tree maken (boomstructuur, denk aan een menu met submenu's).
// recursieve functie voor maken van een boomstructuur
function maakTree($arr=[], $hoofdmenu="")
{
// maak een array
$tree=[];
// loop door alle menuitems
foreach($arr as $item) {
// als menuitem gelijk is aan variabele hoofdmenu (parent) dan...
if($item["parent"] === $hoofdmenu) {
// roep de functie opnieuw aan met nu dit menu als parent (hoofdmenu) en voeg de childeren (resultaat van de functie) toe aan het item
$item["children"] = maakTree($arr,$item["name"]);
// voeg het item met childeren toe aan de tree
$tree[$hoofdmenu][] = $item;
}
}
// geef resultaat terug
return $tree;
}
//json informatie voor het menu
$website = '{"menus":[
{"name":"boeken","parent":"producten"},
{"name":"contact","parent":"root"},
{"name":"root","parent":"website"},
{"name":"producten","parent":"root"},
{"name":"kaarten","parent":"producten"},
{"name":"verjaardagskaarten","parent":"kaarten"},
{"name":"non-fictie","parent":"boeken"},
{"name":"webshop","parent":"root"},
{"name":"kantoor","parent":"producten"},
{"name":"schrijfwaar","parent":"kantoor"},
{"name":"papier","parent":"kantoor"},
{"name":"karton","parent":"papier"},
{"name":"2e WO","parent":"non-fictie"}
]}';
//het menu begint op regel 3 van de json bij website (de root dus)
$root = "website";
//het menu omzetten in een array
$menuArray = json_decode($website, true);
//print_r($menuArray);
//aanroepen van recursieve functie
$tree = makeTree($menuArray["menus"], $root);
//resultaat tonen
print_r($tree);
Als je ook nog een mooie uitvoer wil voor de php webserver dan kan je dat als volgt doen:
Plaats de volgende functie bovenin het script.
// maak de tree in html
function maakMenu($arr=[])
{
$nav='<ul>';
foreach($arr as $key => $val) {
if($val["children"] && count($val["children"]) > 0) {
$nav .= '<li>';
$nav .= "<a href=\"{$val['link']}\">{$val['name']}</a>";
$nav .= '<ul>';
foreach($val["children"] as $item) {
$nav .= maakMenu($item);
}
$nav .= '</ul>';
$nav .= '</li>';
} else {
$nav .= '<li>';
$nav .= "<a href=\"#\">{$val['name']}</a>";
$nav .= '</li>';
}
}
$nav .= '</ul>';
return $nav;
}
en roep de functie onderin het script aan:
$nav = maakMenu($tree[$rootName]);
echo $nav;