0

0

如何递归计算嵌套布尔逻辑表达式数组的最终真值

霞舞

霞舞

发布时间:2026-01-28 17:03:08

|

210人浏览过

|

来源于php中文网

原创

如何递归计算嵌套布尔逻辑表达式数组的最终真值

本文介绍一种通用、高效的递归 php 函数,用于解析任意深度嵌套的 `and`/`or` 逻辑节点数组,准确计算其布尔结果,适用于 laravel 等 php 应用中的动态规则引擎或条件求值场景。

在构建动态权限控制、业务规则引擎或条件过滤器(如高级搜索、风控策略)时,常需将逻辑结构以 JSON 形式存储并运行时求值。上述数据结构本质上是一棵多叉逻辑表达式树:每个节点含 "nodeType" 字段("and" 或 "or"),其余键(如 "0", "1", "3" 等)为子表达式——这些键名无语义,仅作索引,真正重要的是其值(布尔字面量或子节点对象)。

由于树的深度与分支数完全动态,迭代遍历极易出错且难以维护,递归是自然且最优的选择。核心思路是:

  • 基础情况(Base Case):若当前值为 true 或 false,直接返回;
  • 递归情况(Recursive Case):根据 nodeType 决定短路策略:
    • "or" 节点:只要任一子节点返回 true,立即返回 true(OR 短路);
    • "and" 节点:只要任一子节点返回 false,立即返回 false(AND 短路);
  • 收尾逻辑:若遍历完所有子节点均未触发短路,则 "or" 返回 false,"and" 返回 true(即默认值取逻辑恒等元)。

以下是经过验证、鲁棒性强的实现:

PageGen
PageGen

AI页面生成器,支持通过文本、图像、文件和URL一键生成网页。

下载
function evaluateBooleanExpression($expr): bool
{
    // 基础情况:已是布尔值,直接返回
    if (is_bool($expr)) {
        return $expr;
    }

    // 非数组或缺少 nodeType,视为无效节点(可按需抛异常)
    if (!is_array($expr) || !isset($expr['nodeType'])) {
        throw new InvalidArgumentException('Invalid expression: missing "nodeType" or not an array');
    }

    $isOrNode = $expr['nodeType'] === 'or';
    $shortCircuitValue = $isOrNode; // OR 短路于 true;AND 短路于 false

    // 遍历所有非 "nodeType" 的子项
    foreach ($expr as $key => $value) {
        if ($key === 'nodeType') {
            continue;
        }
        $childResult = evaluateBooleanExpression($value);
        if ($childResult === $shortCircuitValue) {
            return $shortCircuitValue; // 触发短路
        }
    }

    // 未短路:OR 全为 false → 返回 false;AND 全为 true → 返回 true
    return !$shortCircuitValue;
}

使用示例与验证

假设你从数据库或 API 获取如下 JSON 字符串(注意外层为单元素数组):

$json = '[
    {
        "nodeType": "and",
        "0": {
            "nodeType": "and",
            "0": {
                "nodeType": "and",
                "1": true,
                "2": false
            },
            "3": true
        },
        "2": {
            "nodeType": "or",
            "4": false,
            "5": true
        }
    }
]';

$data = json_decode($json, true);
$result = evaluateBooleanExpression($data[0]); // 取首个元素
var_dump($result); // 输出: bool(false) ✅ 符合预期(最内层 and(1:true, 2:false) = false,导致顶层 and 整体为 false)

关键注意事项

  • ? 键名无关性:函数自动跳过 "nodeType" 键,其余所有键均视为子表达式入口,完全兼容 "0", "1", "3", "4" 等任意数字或字符串键;
  • ? 严格类型安全:使用 is_bool() 判定基础值,避免 0/1、"true"/"false" 等松散类型干扰;
  • ? 短路优化:无需遍历整棵树,在满足逻辑条件时立即终止,性能随表达式复杂度提升而显著受益;
  • ? 错误防护:对缺失 nodeType 或非数组输入主动抛异常,便于调试与集成测试;
  • ? Laravel 集成建议:可封装为 app/Helpers/LogicEvaluator.php 辅助函数,或定义为 LogicExpression 服务类,配合依赖注入使用。

该方案已通过多层嵌套(含 and→or→and→... 混合)、边界 case(纯叶子节点、空子节点等)充分验证,是生产环境中处理动态布尔逻辑表达式的可靠实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

278

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

372

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

374

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

85

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

65

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

68

2025.08.05

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号