这是我当前的代码,如果给定的字符串以特定字母开头 我开了一个功能......简单......
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
,但不确定如何......
答案 0 :(得分: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.
}
我喜欢使用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']
以提高可读性。如果你的盒子上面有超过两三个字母,并且字母总是连续的,那将是一个不错的选择。
答案 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();
}
}