Rekursija ir daugiamatės struktūros PHP
Duotas daugiamatis masyvas savavališko lygio įdėjimo, pavyzdžiui, toks:
<?php
$arr = [
1,
[
2, 7, 8
],
[
3, 4, [5, [6, 7]],
]
];
?>
Kaip matote, šis masyvas turi sudėtingą struktūrą, be to, daroma prielaida, kad ši struktūra gali būti savavališka, o įdėjimo lygiai gali būti bet kokio gylio.
Tarkime, norime atvaizduoti ekrane visus primityvius (tai yra ne masyvus) mūsų masyvo elementus. Šiuo atveju, norint iteruoti tokį masyvą, mums tiesiog nepavyks naudoti ciklų, nes masyvas turi netaisyklingą struktūrą ir nežinomą įdėjimo lygį.
Tačiau tokiam masyvui iteruoti labai patogu būtų naudoti rekursiją.
Pirmiausia sukurkime funkciją, į kurią parametru perduosime mūsų masyvą, o funkcijoje sukurkime ciklą mūsų masyvui iteruoti:
<?php
function func($arr) {
foreach ($arr as $elem) {
echo $elem;
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Mūsų sukurtas ciklas iteruos tik
pagrindinio masyvo elementus. Tai yra, iš pradžių
jis atvaizduos 1, paskui [2, 7, 8],
o paskui [3, 4, [5, [6, 7]].
Dabar cikle pradėkime skirstyti elementus-primitivus ir elementus-masyvus:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
// elementas - masyvas
} else {
// elementas - primityvas
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
O dabar padarykime taip, kad jei mūsų elementas - masyvas, funkcija iškviestų pati save, perduodama parametru šį masyvą:
<?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]]]]);
?>
Duotas daugiamatis masyvas savavališko lygio įdėjimo, pavyzdžiui, toks:
<?php
$arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>
Naudodami rekursiją atvaizduokite visus primityvius šio masyvo elementus ekrane.