我可以在开关盒中使用strpos吗?

Ste*_*oke 5 php switch-statement

考虑:

我有一个变量叫$field那不时可有(其中包括)值,如action,id和another_term.我想使用一个switch结构来筛选值:

switch ($field) {
    case 'action':
        // do something
        break;
    case 'id':
        // do something
        break;
    case (strpos($field, '_term')):
        // do something else
        break;
}
Run Code Online (Sandbox Code Playgroud)

前两个案例有效.第三个没有.我认为这是对switch语句的错误使用.这是否更好地作为if/else序列处理?

Sve*_*sen 12

你可以使用这样的switch语句来做到这一点:

$field = 'bla bla_term bla';

switch (true) {
    case $field === 'action':
        echo 'action';
    break;
    case $field === 'id':
        echo 'id';
    break;
    case strpos($field, '_term') >= 0:
        echo '_term';
    break;
}
Run Code Online (Sandbox Code Playgroud)

该switch语句只是将每个块中的表达式case与switch括号中的值进行比较.

表达式是可以减少为值的代码单位,例如2 + 3或strpos(...).在PHP中,大多数东西都是表达式

以下是上述示例的注释版本:

// We are going to compare each case against
// the 'true' value
switch (true) {

    // This expression returns true if $field
    // equals 'action'
    case $field === 'action':
        echo 'action';
    break;

    // This expression returns true if $field
    // equals 'id'
    case $field === 'id':
        echo 'id';
    break;

    // This expression returns true if the
    // return value of strpos is >= 0
    case strpos($field, '_term') >= 0:
        echo '_term';
    break;
}
Run Code Online (Sandbox Code Playgroud)

如果你想使用strpos调用的返回值,那么你可以只分配它(赋值是PHP中的表达式):

case ($pos = strpos($field, '_term')) >= 0:
    echo '_term at position ' . $pos;
break;
Run Code Online (Sandbox Code Playgroud)

  • 我想说你应该将最后一种情况与 !== false 进行比较,因为如果子字符串不存在,strpos 可以返回 0: - 来自 php.net:此函数可能返回布尔值 FALSE,但也可能返回一个非布尔值,该值计算为假。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符来测试该函数的返回值。 (2认同)