Почему не происходит возведение всех числовых элементов массива в квадрат при использовании цикла `foreach` в функции `arraySquaring`?
Цикл `foreach` не может использоваться внутри рекурсии, потому что он работает с копией массива, а не с самим массивом. Каждый вызов рекурсивной функции создает новый экземпляр массива, и при использовании цикла `foreach` внутри рекурсии будет происходить обработка только элементов внутри этого нового массива, не затрагивая остальные уровни рекурсии. Чтобы произошло возведение всех числовых элементов массива в квадрат при использовании цикла `foreach`, необходимо изменять элементы напрямую в самом массиве, а не в его копии. Внутри цикла `foreach` элемент массива можно изменить, но это не повлияет на сам массив, так как каждый элемент обрабатывается как копия. Для изменения элементов массива в функции рекурсии можно использовать передачу по ссылке или обращаться к элементам массива по индексу.
function arraySquaring($arr) { - foreach ($arr as $value) { + foreach ($arr as &$value) { if (is_array($value)) { $value = arraySquaring($value); } else { $value **= 2; } } return $arr; }
или так
function arraySquaring($arr) { - foreach ($arr as $value) { + foreach ($arr as $key => $value) { if (is_array($value)) { - $value = arraySquaring($value); + $arr[$key] = arraySquaring($value); } else { - $value **= 2; + $arr[$key] **= 2; } } return $arr; }
Еще вариант
function arraySquaring($arr) { return array_map(function($item){ return is_array($item) ? arraySquaring($item) : $item ** 2; }, $arr); }
function arraySquaring($arr) { return array_map(fn($item) => is_array($item) ? arraySquaring($item) : $item ** 2, $arr); }