Дан массив многомерный произвольного уровня вложенности, например, такой:
<?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]]];
?>
Возведите все элементы-числа этого массива в квадрат.