Рекурсия и многомерни структури в PHP
Даден е многомерен масив с произволно ниво на влагане, например такъв:
<?php
$arr = [
1,
[
2, 7, 8
],
[
3, 4, [5, [6, 7]],
]
];
?>
Както виждате, този масив има сложна структура, като се предполага, че тази структура може да бъде произволна и нивата на влагане могат да бъдат произволно дълбоки.
Да предположим, че искаме да изведем на екрана всички примитивни (тоест не масиви) елементи на нашия масив. В този случай за обхождане на такъв масив просто няма да можем да използваме цикли, тъй като масивът има неправилна структура и неизвестно ниво на влагане.
Вместо това за обхождане на такъв масив ще бъде много удобно да използваме рекурсия.
Като начало ще направим функция, в която като параметър ще предаваме нашия масив, а във функцията ще направим цикъл за обхождане на нашия масив:
<?php
function func($arr) {
foreach ($arr as $elem) {
echo $elem;
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Цикълът, който направихме, ще обхожда само
елементите на основния масив. Тоест първоначално
той ще изведе 1, след това [2, 7, 8],
а след това [3, 4, [5, [6, 7]].
Нека сега в цикъла да разделяме елементите-примитиви и елементите-масиви:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
// елементът е масив
} else {
// елементът е примитив
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
И сега нека направим така, че ако нашият елемент е масив, функцията да извиква сама себе си, предавайки като параметър този масив:
<?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]]]]);
?>
Даден е многомерен масив с произволно ниво на влагане, например такъв:
<?php
$arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>
С помощта на рекурсия изведете всички примитивни елементи на този масив на екрана.