Больше или меньше, чем внутри array_walk рекурсивный

Я пытаюсь заменить array значение с определенным условием.

Предположим, массив $mark имеет следующее значение

$mark = array(90,85);

Просто нормальное проверочное значение, оно отражает правильное значение

array_walk_recursive($mark, function (&$k) { 
  if($k==90){$k='4.0';}
  if($k==85){$k='3.6';}
});

print_r($mark);

Выход

Array ( [0] => 4.0 [1] => 3.6 )

Но при применении условия, такого как больше или меньше, он возвращает неправильное значение.

array_walk_recursive($mark, function (&$k) { 
  if($k>=90){$k='4.0';}
  if($k>=80 AND $k<90){$k='3.6';}
  if($k<79){$k='2.8';}
});

print_r($mark);

И вывод

Array ( [0] => 2.8 [1] => 2.8 )

3 ответа

Решение

Вы должны использовать else в if

<?php
$mark = array(90,85);

array_walk_recursive($mark, function (&$k) { 
    if ($k >= 90) {
        $k = '4.0';
    } else if ($k >= 80 && $k<90) {
        $k = '3.6';
    } else if ($k < 80) {
        $k = '2.8';
    }
});

print_r($mark);

Смотрите это в действии на 3v4l

Каждый if проверяет значение после того, как предыдущее, возможно, уже изменило значение.

когда $k 90, первый if успешно, что меняет его на 4.0,

Второй if не удается, потому что 4.0 не между 80 а также 90,

Третий if успешно, потому что 4.0 меньше чем 79так что это меняет его на 2.8,

Вы должны использовать elseif поэтому он выполняет тесты только в случае неудачи предыдущего теста, а затем всегда будет тестировать исходное значение $k, Вы также можете использовать else для последнего случая.

array_walk_recursive($mark, function (&$k) { 
        if($k>=90) {
            $k='4.0';
        }
        elseif($k>=80 AND $k<90) {
            $k='3.6';
        }
        elseif($k<79) {
            $k='2.8';
        }
    });

Кстати, вы, вероятно, хотели использовать < 80 для последнего теста, или просто else без теста. когда $k это точно 79, вы не будете обновлять его.

Каждый if в вашей функции проверяется, чтобы она появлялась в коде:

// $k is 90
if($k>=90){$k='4.0';}
// $k is 4
if($k>=80 AND $k<90){$k='3.6';}
// $k is still 4
if($k<79){$k='2.8';}
// $k is 2.8

использование if-elseif-else вместо:

if ($k>=90) {
    $k='4.0';
} elseif ($k>=80 AND $k<90){
    $k='3.6';
} else {
    $k='2.8';
}
Другие вопросы по тегам