[英]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
,但不确定如何...
我将提出两个建议:
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. }
我喜欢使用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.