Switch语句返回不正确的结果


Switch Statement returns incorrect results

光晕!我不确定我的switch语句哪里出错了!以下是我希望我的代码执行的操作:

如果这三个变量都是空的,那么我不希望发生任何事情。然而,如果不是,那么我想看看哪些是空的,哪些不是,并根据它们的状态执行不同的任务。

如果它们不为空,那么我想在变量之前添加一个字符串。如果它们是空的,那么我想添加一个字符串,说明"..请提供信息"。

对于当前的硬编码变量,它应该返回:

Airline Name: United 
Flight Number: 262
Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT

但它返回:

Airline Name: PLEASE PROVIDE AIRLINE NAME
Flight Number: PLEASE PROVIDE FLIGHT NUMBER
Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT

代码:

$airline_name = "United";
$flight_number = 262;
$departure_airport = "";
function airport($one, $two, $three) {
if ($one =="" && $two =="" && $three =="") {
} else {
    switch(true) {
        case !empty($one):
        $one = "Airline Name: $one<br>";
        case empty($one):
        $one = "Airline Name: PLEASE PROVIDE AIRLINE NAME<br>";
        case !empty($two):
        $two = "Flight Number: $two<br>";
        case empty($two):
        $two = "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>";
        case !empty($three):
        $three = "Departure Airport: $three<br>";
        case empty($three):
        $three = "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>";
    }
    }
echo $one, $two, $three;
}
airport($airline_name,$flight_number,$departure_airport);
?>

您想要的行为可以用if else或三元运算符来实现(这几乎只是编写if/else的一种简单方法)。这是一个未经测试的粗略例子。

function airport($one, $two, $three) {
   if ( !empty($one) || !empty($two) || !empty($three) ) {
         $one = !empty($one) ? "Airline Name: $one<br>" :"Airline Name: PLEASE PROVIDE AIRLINE NAME<br>";
         $two = !empty($two) ? "Flight Number: $two<br>" : "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>";
         $three = !empty($three) ? "Departure Airport: $three<br>" : "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>";
   }
   echo $one, $two, $three;
}
airport($airline_name,$flight_number,$departure_airport);

至于为什么你的switch没有像你预期的那样运行,请参阅手册:

只有当case语句的值与switch表达式的值匹配时,PHP才会开始执行这些语句PHP继续执行这些语句,直到切换块结束,或者第一次看到break语句如果您没有在案例的语句列表末尾写一个break语句,PHP将继续执行下面案例的语句。

-http://php.net/manual/en/control-structures.switch.php

这里有两个问题。首先,正如评论中所指出的,您的switch语句没有任何breaks。

其次,switch语句只能有一个结果。因此,一旦它找到第一个匹配项(当$one为空或不为空时),它就会结束语句。

在这种情况下,我只使用一系列if语句:

    <?php
    $airline_name = "United";
    $flight_number = 262;
    $departure_airport = "";
    function airport($one, $two, $three) {
    if(!empty($one)){
        $one = "Airline Name: $one<br>";
    } else {
        $one = "Airline Name: PLEASE PROVIDE AIRLINE NAME<br>";
    }
    if(!empty($two)){
        $two = "Flight Number: $two<br>";
    } else {
        $two = "Flight Number: PLEASE PROVIDE AIRLINE NAME<br>";
    }
    if(!empty($three)){
        $three = "Departure Airport: $three<br>";
    } else {
        $three = "Departure Airport: PLEASE PROVIDE AIRLINE NAME<br>";
    }
    echo $one, $two, $three;
    }
    airport($airline_name,$flight_number,$departure_airport);
    ?>

编辑作为对您评论的回应,在这里举一个简单的例子,如果您运行它,您会看到代码只会"先"回显,即使这三种情况都相同。

<?php
$a = 1;
switch ($a) {
    case 1:
        echo 'first';
        break;
    case 1:
        echo 'second';
        break;
    case 1:
        echo 'third';
        break;
}
?>

您的语法错误Switch语句如下。。。

switch ($some_var) {
    case 'Peter':   // if $some_var has value 'Peter'
        # code...   // this line executes if it is true, else breaks and loops through other cases until it finds right val
        break;
    default:
        # code... // default code to be executed if case val isn't found
        break;
}

还有一个问题?为什么使用布尔值来切换值?

您不能以这种方式使用switch语句,您现在所做的是遍历所有情况,而不管您的条件如何。例如,如果您将第一个情况与第二个情况交换,则输出将为"United"。这是因为你需要在每一个案例之后都加上突破,这样当找到正确的选择时,就可以打破循环。你可以使用if-else,看起来更简单、更小的

首先将默认值设置为空

<?php
$airline_name = "United";
$flight_number = 262;
$departure_airport = "";
function airport($one, $two, $three) {
if ($one =="" && $two =="" && $three =="") {
} 
    else
    {
        if ($one == '')
            $one= "PLEASE PROVIDE AIRLINE NAME<br>";
        if ($two == '')
            $two= "PLEASE PROVIDE FLIGHT NUMBER<br>";
        if ($three == '')
            $three = "PLEASE PROVIDE DEPARTURE AIRPORT<br>";
        $x1= "Airline Name: ".$one;
        $x2= "Flight Number: ".$two;
        $x3= "Departure Airport:".$three;
    }

echo $x1, $x2, $x3;
}
airport($airline_name,$flight_number,$departure_airport);
?>