如何简化下述PHP代码中的IF条件逻辑,便于后续迭代修改维护?
PHP条件判断逻辑优化方案
方案1:布尔表达式直接合并(最简单,适合过滤维度固定的场景)
原代码的多分支判断本质是仅对开启的过滤项做校验,所有开启的过滤项都满足才算通过,可以直接用布尔逻辑等价替换,完全消除if分支:
// 等价替换原有的3个if分支逻辑 $filterCondition = (!$isRegionFilter || $regionFilter) && (!$isCityFilter || $cityFilter); if ($filterCondition) { $this->companyIds[$q->id] = $q->name; }
逻辑说明:
- 如果某类过滤未开启(比如
$isRegionFilter = false),则!$isRegionFilter为true,或运算后自动跳过该类过滤的校验 - 如果某类过滤已开启,则必须满足对应过滤条件才会返回true
- 同时解决了原代码中两个过滤都未开启时
$filterCondition未定义的潜在警告问题
方案2:可配置化过滤(扩展性最强,适合后续会新增过滤维度的场景)
如果后续可能新增省份、区县、网点等更多过滤维度,推荐用配置数组的方式实现,新增过滤不需要修改判断逻辑,维护成本极低:
// 新增过滤维度只需在该数组追加配置即可 $filterConfig = [ [ 'enable' => $isRegionFilter, 'checkResult' => $regionFilter ], [ 'enable' => $isCityFilter, 'checkResult' => $cityFilter ] ]; $filterCondition = true; foreach ($filterConfig as $config) { if ($config['enable'] && !$config['checkResult']) { $filterCondition = false; break; // 提前终止循环,不需要继续校验后续项 } } if ($filterCondition) { $this->companyIds[$q->id] = $q->name; }
额外优化点:简化前置过滤条件的写法
PHP7及以上版本可以用null合并运算符简化isset判断,代码更简洁:
// 原$regionFilter判断简化 $regionFilter = in_array($additionalDate['region'] ?? '', $this->request["insuranceCompanyRegion"] ?? []); // 原$cityFilter判断简化 $cityFilter = in_array($additionalDate['city'] ?? '', $this->request["insuranceCompanyCity"] ?? []);
如果$this->request里的区域、城市配置一定存在的话,可以去掉后面的?? []。
内容的提问来源于stack exchange,提问作者Daniil Petrenko
相关产品推荐
相关产品推荐

