考虑一下:
我有一个名为$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;
}
前两种情况有效。第三个没有。我认为这是对switch语句的错误使用。这更好地作为if / else序列处理吗?
答案 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 + 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中的表达式):
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"只是"地址"或"某事"