Больше или меньше, чем внутри array_walk рекурсивный - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь заменить значение 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 ]

0 голосов
/ 06 февраля 2019

Вы должны использовать 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

0 голосов
/ 06 февраля 2019

Каждый 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, вы не будете его обновлять.

0 голосов
/ 06 февраля 2019

Каждый 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';
}
...