开关箱结构 - 虽然虚假仍然存在

时间:2014-01-21 17:54:14

标签: php

我有以下代码:

$days = 0;
$daysLastChar = mb_substr($days, -1);
switch ($daysLastChar) {
    case in_array($daysLastChar, Array("1")): {
        $correctDaysForm = "день";
        break;
    }
    case in_array($daysLastChar, Array("2", "3", "4")): {
        $correctDaysForm = "дня";
        break;
    }
    case in_array($daysLastChar, Array("5", "6", "7", "8", "9", "0")): {
        $correctDaysForm = "дней";
        break;
    }            
}

第一种情况布尔值in_array($daysLastChar, Array("1"))表达式求值为FALSE但流程进入此案例并将$correctDaysForm变量设置为不正确的第一个值。为什么这样?如果天数以零以外的数字结束,则不会发生这种情况。

2 个答案:

答案 0 :(得分:5)

这是您如何使用switch语句。 switch将($daysLastChar)中传递的值与每个case语句的值进行匹配。

所以,它正在尝试$daysLastChar == in_array($daysLastChar, Array("1"))(依此类推)。 in_array返回一个布尔值,$daysLastChar(我假设)是一个int。所以,你可以看到它与你期望它的陈述不匹配。

switch使用“松散比较”(意味着它使用==代替===)。因此,如果$daysLastChar0,那么它将匹配第一个案例,因为in_array返回false,其{em>值与{{1}相同}}

执行此操作的一种方法是使用0。因此,它会将switch(true)与每个语句进行比较,以查看哪些匹配。或者,您可以将其转换为true / if

答案 1 :(得分:1)

您正在启用$daysLastChar。因此,如果in_array($daysLastChar, Array("1"))评估为$daysLastChar,则执行该案例。