@BjornBorn

Почему не сохраняются изменения при переборе цикла через foreach?

Есть массив:
$arr = [1, [2, 7, 8], [3, 4], [5, [6, 7]]];
Нужно возвести все элементы-числа этого массива в квадрат.
Если использовать цикл for, то всё работает:
function arraySquaring($arr)
{
    $length = count($arr);
    for ($i = 0; $i < $length; $i++) {
        if (is_array($arr[$i])) {
            $arr[$i] = arraySquaring($arr[$i]);
        }else {
            $arr[$i] **= 2;
        }
    }
    return $arr;
}

А вот с циклом foreach нет:

function arraySquaring($arr)
{
    foreach ($arr as $value) {
        if (is_array($value)) {
            $value = arraySquaring($value);
        } else {
            $value **= 2;
        }
    }
    return $arr;
}

Почему?
  • Вопрос задан
  • 158 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
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);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы