You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化下述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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:15:04