Рекурсия и многомерные структуры в 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]]]; ?>

С помощью рекурсии выведите все примитивные элементы этого массива на экран.

Сумма элементов массива

Давайте найдем сумму примитивных элементов нашего массива:

<?php function func($arr) { $sum = 0; foreach ($arr as $elem) { if (is_array($elem)) { $sum += func($elem); } else { $sum += $elem; } } return $sum; } var_dump(func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]])); ?>

Дан многомерный массив произвольного уровня вложенности, например, такой:

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

С помощью рекурсии найдите сумму элементов этого массива.

Дан многомерный массив произвольного уровня вложенности, содержащий внутри себя строки, например, такой:

<?php $arr = ['a', ['b', 'c', 'd'], ['e', 'f', ['g', ['j', 'k']]]]; ?>

С помощью рекурсии слейте элементы этого массива в одну строку:

'abcdefgjk'

Манипуляции с элементами

Давайте что-нибудь сделаем с перебираемыми элементами массива, к примеру, запишем им в конец знак '!':

<?php function func($arr) { $length = count($arr); for ($i = 0; $i < $length; $i++) { if (is_array($arr[$i])) { $arr[$i] = func($arr[$i]); } else { $arr[$i] = $arr[$i] . '!'; } } return $arr; } var_dump(func([1, [2, 7, 8], [3, 4, [5, 6]]])); ?>

Дан многомерный массив произвольного уровня вложенности, например, такой:

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

Возведите все элементы-числа этого массива в квадрат.