PHP中检查$flex及其数字后缀变体值的无循环实现方案咨询
问题解答
可以不用编写0到99的显式循环实现需求,正则表达式不是必须使用的。
实现方案(无需正则、无显式循环)
PHP 可通过内置数组函数直接筛选符合规则的变量,不用自己写循环逻辑:
// 适配所有PHP版本的写法 $isFlexOpen = false; // 先判断基础变量 if ($flex === 'yes') { $isFlexOpen = true; } else { // 筛选所有符合flex+1-99命名规则的变量 $allVars = $GLOBALS; $matchedFlexVars = array_filter( $allVars, function ($key) { if (substr($key, 0, 4) !== 'flex') { return false; } $numPart = substr($key, 4); return ctype_digit($numPart) && $numPart >= 1 && $numPart <=99; }, ARRAY_FILTER_USE_KEY ); // 判断是否存在值为yes的变量 if (in_array('yes', $matchedFlexVars)) { $isFlexOpen = true; } } if ($isFlexOpen) { // 执行你需要的操作 }
如果是PHP 8.0及以上版本,代码可以更简洁:
$isFlexOpen = $flex === 'yes' || in_array( 'yes', array_filter( $GLOBALS, fn($k) => str_starts_with($k, 'flex') && ctype_digit(substr($k,4)) && substr($k,4) >=1 && substr($k,4) <=99, ARRAY_FILTER_USE_KEY ) ); if ($isFlexOpen) { // 执行操作 }
注意:你提供的示例判断条件里用的是
== "on",如果实际变量取值是"on"而非"yes",把上面代码里的判断值替换为'on'即可。
可选正则实现(代码更精简)
如果你接受用正则,筛选变量名的逻辑可以更短,同样不需要显式循环:
// 用正则匹配所有符合规则的变量名 $matchedKeys = preg_grep('/^flex[1-9][0-9]?$/', array_keys($GLOBALS)); $isFlexOpen = $flex === 'yes' || in_array('yes', array_map(fn($k) => $GLOBALS[$k], $matchedKeys)); if ($isFlexOpen) { // 执行操作 }
说明
上面所有方案都没有手动编写1到99的循环逻辑,遍历判断的逻辑由PHP内置函数底层实现。如果不想引入正则的学习和维护成本,完全可以只用字符串判断函数实现需求。
内容的提问来源于stack exchange,提问作者user3304303
相关产品推荐
相关产品推荐

