Почему цикл foreach не может использоваться внутри рекурсии?

Почему не происходит возведение всех числовых элементов массива в квадрат при использовании цикла `foreach` в функции `arraySquaring`?
  • 24 августа 2024 г. 15:44
Ответы на вопрос 2
Цикл `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);
}
Похожие вопросы