Rekursio ja moniulotteiset rakenteet PHP:ssä
Annettu taulukko on moniulotteinen mielivaltaisella sisäkkäisyystasolla, esimerkiksi tällainen:
<?php
$arr = [
1,
[
2, 7, 8
],
[
3, 4, [5, [6, 7]],
]
];
?>
Kuten näette, tällä taulukolla on monimutkainen rakenne, ja oletetaan, että tämä rakenne voi olla mielivaltainen ja sisäkkäisyystasot voivat olla miten syviä tahansa.
Oletetaan, että haluamme tulostaa kaikki primitiiviset (eli eivät taulukoita) elementit taulukostamme. Tässä tapauksessa tällaisen taulukon läpikäyntiin emme yksinkertaisesti pysty käyttämään silmukoita, koska taulukolla on epäsäännöllinen rakenne ja tuntematon sisäkkäisyystaso.
Sen sijaan tällaisen taulukon läpikäyntiin on erittäin kätevää käyttää rekursiota.
Aluksi teemme funktion, jolle parametrina annamme taulukkomme, ja funktiossa teemme silmukan taulukkomme läpikäyntiä varten:
<?php
function func($arr) {
foreach ($arr as $elem) {
echo $elem;
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Tekemämme silmukka käy läpi vain
päätaulukon elementit. Eli aluksi
se tulostaa 1, sitten [2, 7, 8],
ja sitten [3, 4, [5, [6, 7]].
Erotellaan nyt silmukassa primitiivielementit ja taulukkoelementit:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
// elementti on taulukko
} else {
// elementti on primitiivi
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Ja nyt tehdään niin, että jos elementtimme on taulukko, funktio kutsuu itseään, välittäen parametrina tämän taulukon:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
func($elem);
} else {
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Annettu moniulotteinen taulukko mielivaltaisella sisäkkäisyystasolla, esimerkiksi tällainen:
<?php
$arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>
Käytä rekursiota tulostaaksesi kaikki primitiiviset elementit tästä taulukosta.