PHP开关仅显示第一种情况的结果

PHP开关仅显示第一种情况的结果,php,switch-statement,Php,Switch Statement,我在搜索表单中有三个下拉列表。如果只选择了一个下拉选项,我想显示结果。现在,搜索只适用于第一个下拉框选择(在本例中,它是$StockType)。如果在第二个或第三个下拉列表中仅选择一个选项,则不会显示任何结果。这是我的交换声明: $StockType = $_GET['StockType']; $make = $_GET['Make']; $model = $_GET['Model']; switch (true) { case ($StockType): $pag

我在搜索表单中有三个下拉列表。如果只选择了一个下拉选项,我想显示结果。现在,搜索只适用于第一个下拉框选择(在本例中,它是$StockType)。如果在第二个或第三个下拉列表中仅选择一个选项,则不会显示任何结果。这是我的交换声明:

$StockType = $_GET['StockType'];
$make = $_GET['Make'];
$model = $_GET['Model'];


switch (true) {

    case ($StockType):
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $args = array(
            'post_type' => 'vehicle',
            'paged' => $paged,
            'posts_per_page' => 15,
            'meta_key' => 'StockType', 
            'meta_value' => $StockType
        );
        break;

    case ($make):
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $args = array(
            'post_type' => 'vehicle',
            'paged' => $paged,
            'posts_per_page' => 15,
            'meta_key' => 'Make', 
            'meta_value' => $Make
        );
        break;

    case ($model):
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $args = array(
            'post_type' => 'vehicle',
            'paged' => $paged,
            'posts_per_page' => 15,
            'meta_key' => 'Model', 
            'meta_value' => $model
        );
        break;

}

千万不要将switch与true一起使用,这意味着唯一适用的情况是第一个计算结果为true或没有值的情况

您想做的是:

switch($value){
    case 'value 1': 
        doSomething();
        break;
    case 'value 2': 
        doSomething();
        break;
    case 'value 3': 
        doSomething();
        break;
}

查看关于PHP中的类型转换的文章,以更深入地了解您的问题:

您不应该将switch与true一起使用,这意味着唯一适用的情况是第一个计算结果为true或没有值的情况

您想做的是:

switch($value){
    case 'value 1': 
        doSomething();
        break;
    case 'value 2': 
        doSomething();
        break;
    case 'value 3': 
        doSomething();
        break;
}

请阅读关于PHP中的类型转换的文章,以更深入地了解您的问题:

如果正确使用,Switch true将起作用。试试这个:

switch (true) {

case ( !empty($_GET['StockType']) ):
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'vehicle',
        'paged' => $paged,
        'posts_per_page' => 15,
        'meta_key' => 'StockType', 
        'meta_value' => $StockType
    );
    break;

case ( !empty($_GET['Make']) ):
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'vehicle',
        'paged' => $paged,
        'posts_per_page' => 15,
        'meta_key' => 'Make', 
        'meta_value' => $make
    );
    break;

case ( !empty($_GET['Model']) ):
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'vehicle',
        'paged' => $paged,
        'posts_per_page' => 15,
        'meta_key' => 'Model', 
        'meta_value' => $model
    );
    break;
}

如果正确使用,开关true将起作用。试试这个:

switch (true) {

case ( !empty($_GET['StockType']) ):
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'vehicle',
        'paged' => $paged,
        'posts_per_page' => 15,
        'meta_key' => 'StockType', 
        'meta_value' => $StockType
    );
    break;

case ( !empty($_GET['Make']) ):
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'vehicle',
        'paged' => $paged,
        'posts_per_page' => 15,
        'meta_key' => 'Make', 
        'meta_value' => $make
    );
    break;

case ( !empty($_GET['Model']) ):
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        'post_type' => 'vehicle',
        'paged' => $paged,
        'posts_per_page' => 15,
        'meta_key' => 'Model', 
        'meta_value' => $model
    );
    break;
}

是的,它始终运行第一个案例,即使您重新排列案例顺序,它也将运行第一个案例,因为您的开关案例编码不正确。 例如,如果用户选择第三个下拉列表,则在$model中设置一个值,并将其他变量设置为NULL值,但在您的编码情况下,它始终显示为第一种情况,即$stocktype设置为NULL,但它也满足条件。根据我的观点,你必须尝试:

if($_GET['stocktype']!=''){
$yourvalue=$_GET['stocktype'];
}
elseif($_GET['model']!=''){
$yourvalue=$_GET['model'];
}
elseif($_GET['make']!=''){
$yourvalue=$_GET['make'];
}
switch($yourvalue){
case 'stocktype':
//your code
break;
case 'make':
//your code
break;
case 'mode;':
//your code
break;
default:

} 

是的,它总是运行第一个案例,即使您重新排列案例顺序,它也会运行第一个案例,因为您的开关案例编码不正确。 例如,如果用户选择第三个下拉列表,则在$model中设置一个值,并将其他变量设置为NULL值,但在您的编码情况下,它始终显示为第一种情况,即$stocktype设置为NULL,但它也满足条件。根据我的观点,你必须尝试:

if($_GET['stocktype']!=''){
$yourvalue=$_GET['stocktype'];
}
elseif($_GET['model']!=''){
$yourvalue=$_GET['model'];
}
elseif($_GET['make']!=''){
$yourvalue=$_GET['make'];
}
switch($yourvalue){
case 'stocktype':
//your code
break;
case 'make':
//your code
break;
case 'mode;':
//your code
break;
default:

} 

第一次看到switch(true){}时,我建议使用
var\u dump($\u GET)
查看您得到的值是什么。它看起来像
$\u GET['StockType']
总是被设置为某个值。Charaf jra,你能解释一下这有什么问题吗?@user715564-我已经使用PHP很长时间了,我以前从未见过它以这种方式使用;但是PHP文档页面说,找到第一个有值的变量是一个简洁的快捷方式。基本上在PHP中,switch(a)…case(b)只是测试(a==b)。第一次看到switch(true){}时,我建议使用
var\u dump($\u GET)
来查看您得到的值是什么。它看起来像
$\u GET['StockType']
总是被设置为某个值。Charaf jra,你能解释一下这有什么问题吗?@user715564-我已经使用PHP很长时间了,我以前从未见过它以这种方式使用;但是PHP文档页面说,找到第一个有值的变量是一个简洁的快捷方式。基本上在PHP中,switch(a)…case(b)只是测试(a==b)。所以你可以用它玩各种奇怪的把戏。当然可以,但是如果你要这么做,为什么还要用
开关呢?只需使用普通的旧
if
语句并删除嵌套级别。@IanMcLaird确实没有理由。也许两种方式都没有太大区别。可能更喜欢箱子的外观。实际上,如果你想让一些案例相互渗透,这可能很有用。这段代码闻起来很难闻,你必须仔细阅读才能理解这里要实现的目标,不要用这种方式切换,而是使用if语句!在大多数情况下,我只是想让它工作:)不管怎样,您的解决方案都会有所帮助。看起来问题出在我的URL结构中。当我提交一个只选择一个选项的搜索时,URL仍然包含每个变量,例如/?s=&StockType=&Make=CHEVROLET&Model=&post_-type=vehicle@user715564试试看!empty()而不是isset(),这应该可以正常工作,但如果要这样做,为什么还要使用
开关呢?只需使用普通的旧
if
语句并删除嵌套级别。@IanMcLaird确实没有理由。也许两种方式都没有太大区别。可能更喜欢箱子的外观。实际上,如果你想让一些案例相互渗透,这可能很有用。这段代码闻起来很难闻,你必须仔细阅读才能理解这里要实现的目标,不要用这种方式切换,而是使用if语句!在大多数情况下,我只是想让它工作:)不管怎样,您的解决方案都会有所帮助。看起来问题出在我的URL结构中。当我提交一个只选择一个选项的搜索时,URL仍然包含每个变量,例如/?s=&StockType=&Make=CHEVROLET&Model=&post_-type=vehicle@user715564试试看!empty()而不是isset(),应该可以