Больше или меньше, чем внутри 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';
}