PHP:具有多种条件的切换,更优雅的方式?

时间:2016-03-02 16:52:51

标签: php

这是我当前的代码,如果给定的字符串以特定字母开头 我开了一个功能......简单......

      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,但不确定如何......

4 个答案:

答案 0 :(得分:1)

我会提出两点建议:

  1. 切换语法允许您通过落实(在一个案例和下一个案例之间省略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.
    
  3. 如下面的@devon所述,您可以将range('a', 'c')替换为['a', 'b', 'c']以提高可读性。如果你的盒子上面有超过两三个字母,并且字母总是连续的,那将是一个不错的选择。

答案 1 :(得分:0)

你可以堆叠案例,但是,你也要小心使用break。休息意味着它不会检查任何其他情况。如果'c'可以执行x()和y(),你会想要这样的东西:

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

答案 2 :(得分:0)

除了其他答案之外,还可以通过定义地图/图例数组并循环遍历它来使用它。

/*
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";  
}

答案 3 :(得分:0)

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

$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 s进行分组:

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();
    }
}