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