【问题标题】:Put multiple if in a switch将多个 if 放在一个开关中
【发布时间】:2014-07-22 08:01:01
【问题描述】:

如果可能的话,我想把所有这些“如果”条件放在一个大开关上。 Soo 这是我的功能:

function checkModel($model){

$model_value = 'Default Model';

if (strpos($model,'TMP') !== false) {
    $model_value = 'TMP - Default';
}
if (strpos($model,'TMT') !== false) {
    $model_value = 'TMT - Default';
}
if (strpos($model,'TMS') !== false) {
    $model_value = 'TMS - Default';
}
if (strpos($model,'IcomSpeed') !== false) {
    $model_value = 'IcomSpeed - Default';
}
if (strpos($model,'TMSSA') !== false) {
    $model_value = 'TMSSA - Default';
}
if (strpos($model,'IcomsDisplay') !== false) {
    $model_value = 'IcomsDisplay - Default';
}   
if (strpos($model,'ITV') !== false) {
    $model_value = 'ITV - Default';
}   
if (strpos($model,'Terminal') !== false) {
    $model_value = 'Terminal - Default';
}   
if (strpos($model,'IcomsTexto') !== false) {
    $model_value = 'IcomsTexto - Default';
}   
if (strpos($model,'PIV') !== false) {
    $model_value = 'PIV - Default';
}   
if (strpos($model,'TM150') !== false) {
    $model_value = 'TM150 - Default';
}   
if (strpos($model,'TM60') !== false) {
    $model_value = 'TM60 - Default';
}

return ($model_value);
};

我真的不知道我该怎么做:/这就是我问你们的原因^^

我为什么要这样做:

Bcz 用一个开关我可以直接用“break”退出,在这个版本中,程序会检查每个“if”条件,我认为-_-?

现在如果你告诉我“if”版本比“switch”版本快,那就别说了:p

【问题讨论】:

    标签: php if-statement switch-statement


    【解决方案1】:

    花括号/C 语法语言(C、C++、C#、Java、Perl、PHP)中的switch 不支持每个 case 语句中的复杂操作,因为传统上 switch 语句被编译成hashtable,只允许立即比较,不允许中间操作。 PHP 不是这样编译的,但是关于switch 的语法规则仍然存在。

    ...简而言之,在这种情况下您不能使用switch,但是您可以通过将代码转换为使用关联数组然后对其进行迭代来简化代码。

    function checkModel($model){
    
        $arr = array(
            'TMP', 'TMT', 'TMS', 'IcomSpeed', /* etc... */
        );
    
        foreach ($arr as $str) {
            if( strpos($model, $str) !== false ) return $str . ' - Default';
        }
    
        return 'Default Model';
    }
    

    【讨论】:

    • 谢谢你的解释,我喜欢你对数组的想法^^
    • 感谢您花时间为我编写代码,非常感谢。这正是我想要的:D
    【解决方案2】:

    你不能在这里使用switch

    你可以做的是:是:

    if (strpos($model,'TMP') !== false) {
        return 'TMP - Default';
    }
    

    这将使它在满足条件后立即停止。

    【讨论】:

      【解决方案3】:

      如果您想了解开关的工作原理,可以阅读this

      但是看起来你只是想稍微清理一下你的函数。虽然我绝不是专家,但我会这样做:

      function checkModel( $model ) {
          $strings = array( 'TMP' , 'TMT' , 'TMS' , 'IcomSpeed' , 'TMSSA' , 'IcomsDisplay' , 'ITV' , 'Terminal' , 'IcomsTexto' , 'PIV' , 'TM150' , 'TM60');
          foreach( $strings as $s ) 
              if( strpos( $model , $s ) !== FALSE )
                  return $s . " - Default";
          return "Default Model";
      }
      

      我没有尝试运行此代码。

      【讨论】:

      • 我从未使用过“foreach”,但我尝试了与普通“for”相同的方式,效果很好,但我仍然不知道它是否更快或相同:/
      • @Booba__2012 使用 PHP 或其他解释型语言时(除非您有 PHP JIT 或 AOT 编译器)您不应该关心微优化,只需确保您的算法' 空间和计算复杂度合适(en.wikipedia.org/wiki/Computational_complexity_theory
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多