繁体   English   中英

PHP:切换多个条件,更好的更优雅的方式吗?

[英]PHP: switch with multiple conditions, a better more elegant way?

这是我当前的代码,如果给定的字符串以特定的字母开头,我将触发一个函数...简单...

      switch ($string[0]) {
        case 'a':
            //do   X
            break;
        case 'b':
             //do   Y
            break;
        case 'c':
            //do   Z
            break;
        case 'd':
            //do   X
            break;
//
// etc etc with all alphabet
//
        default:
            //do some
            break;
    }

但如果要同时满足a,b和c,我想触发函数X,如果另一组字母符合条件,则要触发函数Y ...

我想知道是否有更优雅的方法来代替26个字母切换。

我想我需要使用preg_match ,但不确定如何...

我将提出两个建议:

  1. switch语法使您可以通过多次执行(省略一个个案与下一个个案之间的break来针对多个个案执行相同的代码。

     switch ($string[0]) { case 'a': case 'b': case 'c': handle_A_B_C(); break; case 'd': case 'e': handle_D_E(); break; // ...etc. } 
  2. 我喜欢使用in_array()以一种简洁,易读的方式进行多个相等比较。

     if (in_array($string[0], ['a', 'b', 'c'])) { handle_A_B_C(); } elseif (in_array($string[0], ['d', 'e'])) { handle_D_E(); } // ... etc. 

如下面的@devon所指出的那样,您可以将range('a', 'c')替换为['a', 'b', 'c']以提高可读性。 如果您遇到的情况是触发两个或三个以上字母,并且这些字母始终是连续的,那将是一个不错的选择。

您可以堆叠案例,但是,也要小心使用break。 中断表示它将不检查任何其他情况。 如果'c'可以同时执行x()和y(),则您将需要以下内容:

switch ($string[0]) {
    case 'a':
    case 'b':
    case 'c':
        x();
    case 'c':
    case 'd':
        y();
}

除了其他答案外,还可以通过定义一个map / legend数组并遍历它来使用它。

/*
Define legends function as a key,  letters array as value
*/
$legend=array (
    'process_abc'=>array('a','b','c'),
    'process_gpo'=>array('g','p','o')
);

/*
    loop through the legend and check if it exists within the array
*/
foreach ($legend as $function=>$letters){
     if (in_array($string[0],$letters)){
        call_user_func($function);
        break;
     }
}


function process_abc(){
    echo "ABC was called";  
}

function process_gpo(){
    echo "GPO was called";  
}

您也可以像这样使用开关:

$char = 'z';
switch (true) {
    case strpos('abcdef', $char) !== -1:
        echo 'Do A';
    break;
    case strpos('ghijkl', $char) !== -1:
        echo 'Do B';
    break;
    case strpos('mnopqr', $char) !== -1:
        echo 'Do C';
    break;
    case strpos('stuvw', $char) !== -1:
        echo 'Do D';
    break;
    case strpos('xyz', $char) !== -1:
        echo 'Do E';
    break;
}

或将case分组:

switch ($char) {
    case 'a':
    case 'b':
    case 'c':
        echo 'Do A';
    break;
    case 'd':
    case 'e':
    // ...
        echo 'Do B';
    break;
    // ...
}

或这个:

$actions = [
    'abcde':  function () { return 'Do A'; },
    'fghij':  function () { return 'Do B'; },
    'klmno':  function () { return 'Do C'; },
    'pqrst':  function () { return 'Do D'; },
    'uvwxyz': function () { return 'Do E'; },
];
$char = 'n';
foreach ($actions as $haystack => $callback) {
    if (strpos($haystack, $char) !== -1) {
        echo $callback();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM