Если бы это было так, и мне делать было нехер, то было бы прекрасно, но это не так. Я ученик и ветка для новичков, что не так? Вот код: Код (Text): 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]]]])); 1 итерация: $elem - это не массив, выполняется else, в $sum записывается 1. 2 итерация: $elem - это массив, в $sum записывается 1 + ($elem - это уже не массив, должно выполнится else и оно выполняется), а нахера мы начинали записывать тогда после проверки $elem на массив что-то в $sum ? И если написать вместо $sum += func($elem); вот так: Код (Text): func($elem); то ничего не работает, вот и прошу Вас описать последовательно как работает код, не сложно же для Вас, судя по всему?
@petrovmlq Всё просто. У нас рекурсивная структура данных, а именно - числовой массив, который может в себе содержать другие числовые массивы. Тут главной понимать, как работают вызовы и локальные переменные. А работают они благодаря стеку вызовов. При каждом вложенном вызове $sum, которая в конце возвращается, своя. Таким образом алгоритм сводится к следующему: Начинаем цикл по всем элементам массива, чтоб посчитать его сумму Если очередной элемент - просто число, прибавляем его к $sum Если же очередной элемент массив, считаем сумму его элементов, и прибавляем эту сумму к нашему $sum Таким образом, при приведённых данных, вызов функции func верхнего уровня сначала к своему $sum прибавит 1, потом прибавит сумму чисел 2, 7 и 8, т.е. 17, ну и так далее. Самое главное - понять, что каждый вложенный вызов работает со своими аргументами, и со своими локальными переменными. Если непонятно объяснил, загугли "стек вызовов". Рекурсия - тот случай, когда надо понимать не только как пользоваться, но и благодаря чему оно работает.