Php 我可以在交换机机箱中使用STRPO吗?

Php 我可以在交换机机箱中使用STRPO吗?,php,switch-statement,Php,Switch Statement,考虑: 我有一个名为$field的变量,除其他变量外,该变量可能不时具有action、id、和另一个术语等值。我想使用开关结构筛选值: switch ($field) { case 'action': // do something break; case 'id': // do something break; case (strpos($field, '_term')): // do so

考虑:

我有一个名为
$field
的变量,除其他变量外,该变量可能不时具有
action
id
、和
另一个术语
等值。我想使用
开关
结构筛选值:

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

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

开关只是一种
if x==y
,y是任何匹配的情况

case(strpos($field,'.'u term'))
如果未找到匹配项或找到“_term”的点(0到字符串长度-1)而不是字段名,则将导致-1

如果你想抓住现场有短语“\u term”的任何东西,请

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

这将替换字段值“address\u term”或其他任何“something\u term”为“address”或“something”

您可以使用如下语句执行此操作:

$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+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;
}
如果要使用
strpos
调用的返回值,则可以分配它(分配是PHP中的表达式):


是的,你说得对。Strpos返回位置或-1,而不是字符串,因此大小写永远不会匹配。好的,我会重新考虑用什么来代替strposI。我更新了我的回复,告诉你我想做什么,但我不确定。你可以反其道而行之,以“/.+(_term)$/”作为表达式,它会将任何以“_term”结尾的内容转换为“_term”,因此你可以使用switch语句来表示“_term”:谢谢,这正是我正试图做的。对于其他人来说,尽管这个解决方案满足了我的需要,
另一部_terminator_电影
在第三种情况下也是如此。如果您需要明确说明
\u term
是被测试字符串的最后一部分,那么可以使用类似于MiDri的答案,也可以使用其中一个[可能更合适。我想说您应该将最后一个大小写与!==false进行比较,因为如果子字符串不存在,strpos可以返回0:-来自php.net:此函数可能返回Boolean false,但也可能返回一个计算结果为false的非Boolean值。有关详细信息,请阅读Booleans部分。请使用===运算符测试此函数的返回值。
case ($pos = strpos($field, '_term')) >= 0:
    echo '_term at position ' . $pos;
break;