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

时间:2015-11-07 23:29:55

标签: php switch-statement

考虑一下:

我有一个名为$field的变量,其中可能不时包含actionidanother_term等值。我想使用switch结构来筛选值:

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

前两种情况有效。第三个没有。我认为这是对switch语句的错误使用。这更好地作为if / else序列处理吗?

2 个答案:

答案 0 :(得分:11)

您可以使用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;
}

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

表达式是您可以减少为某个值的代码单位,例如2 + 3strpos(...)。在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;
}

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

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

答案 1 :(得分:1)

切换只是一种if x == y,其中y是任何匹配的情况。

如果找不到匹配,

case (strpos($field, '_term'))将导致-1,或者" _term"找到了(0到字符串长度-1)而不是字段名称。

如果你想用短语" _term"在现场做

$matches = array();
if(preg_match('/(.+)_term$/', $field, $matches)) {
    $field = $matches[1];
}

这将取代字段值" address_term"或者什么永远" something_term"只是"地址"或"某事"