Rekursija ir daugiamatės struktūros PHP

Duotas daugiamatis masyvas savavališko lygio įdėjimo, pavyzdžiui, toks:

php<?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<?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<?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<?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]]]]);
?>
Задание 1

Duotas daugiamatis masyvas savavališko lygio įdėjimo, pavyzdžiui, toks:

php<?php
  $arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>

Naudodami rekursiją atvaizduokite visus primityvius šio masyvo elementus ekrane.