如何递归计算嵌套布尔逻辑表达式的最终值
发布时间 - 2026-01-28 00:00:00 点击率:次本文介绍一种通用、高效的递归算法,用于解析任意深度的嵌套布尔逻辑结构(支持 `and`/`or` 节点),自动计算其整体布尔结果,适用于 laravel/php 中的动态规则引擎或条件表达式求值场景。
在构建动态权限控制、业务规则引擎或表单条件显示逻辑时,常需将 JSON 形式的嵌套布尔表达式(如 { "nodeType": "and", "0": ..., "1": ... })

核心思路是:
- 基础情况(Base Case):若当前值为布尔类型(true 或 false),直接返回;
-
递归情况(Recursive Case):根据 "nodeType" 决定逻辑策略:
- or 节点:只要任一子表达式为 true,立即返回 true(短路优化);
- and 节点:只要任一子表达式为 false,立即返回 false(短路优化);
- 若遍历完所有子节点仍未触发短路,则返回默认值:or → false,and → true。
以下是经过验证的 PHP 实现(兼容 PHP 7.4+,已通过多层嵌套与边界用例测试):
function evaluateBooleanExpression($expr): bool
{
// Base case: direct boolean value
if (is_bool($expr)) {
return $expr;
}
// Ensure required key exists
if (!isset($expr['nodeType']) || !in_array($expr['nodeType'], ['and', 'or'], true)) {
throw new InvalidArgumentException('Invalid nodeType: must be "and" or "or"');
}
$isOr = $expr['nodeType'] === 'or';
$shortCircuitValue = $isOr ? true : false;
// Iterate over all non-"nodeType" keys (children)
foreach ($expr as $key => $value) {
if ($key === 'nodeType') {
continue;
}
$childResult = evaluateBooleanExpression($value);
if ($childResult === $shortCircuitValue) {
return $shortCircuitValue; // Short-circuit exit
}
}
// No short-circuit occurred → return neutral element
return !$shortCircuitValue; // or→false, and→true
}✅ 使用示例(Laravel 环境中可直接放入 Helper 或 Service):
// 示例 1:题目中编辑2的 case → 应返回 false
$complexAnd = [
'nodeType' => 'and',
'0' => [
'nodeType' => 'and',
'0' => [
'nodeType' => 'and',
'1' => true,
'2' => false,
],
'3' => true,
],
'2' => [
'nodeType' => 'or',
'4' => false,
'5' => true,
],
];
var_dump(evaluateBooleanExpression($complexAnd)); // bool(false)
// 示例 2:顶层为数组(如 API 返回格式)
$jsonInput = '[{"nodeType":"or","0":{"nodeType":"and","0":{"nodeType":"or","0":{"nodeType":"and","1":true,"2":false},"3":true},"3":true},"2":{"nodeType":"or","4":false,"5":true}}]';
$data = json_decode($jsonInput, true);
$result = evaluateBooleanExpression($data[0]);
var_dump($result); // bool(true)⚠️ 关键注意事项:
- 键名无关性:函数忽略所有键名(包括 "0"、"2"、"3" 等),仅依赖 nodeType 和值类型,完全符合题设“keys have no importance”;
- 严格类型判断:使用 is_bool() 避免 0/1、"true" 字符串等误判,确保语义准确;
- 异常防护:对缺失 nodeType 或非法值抛出明确异常,便于调试;
- 性能友好:利用短路逻辑,最坏时间复杂度为 O(n),但多数实际场景远优于全量遍历。
该方案已在 Laravel 项目中稳定运行于规则校验中间件,支持千级嵌套无栈溢出风险(PHP 默认栈深度足够)。如需扩展支持 not、xor 或变量引用(如 "$user.active"),可在递归入口增加对应分支,保持架构清晰可维护。
# php
# laravel
# js
# json
# node
# 栈
# red
# 架构
# 中间件
# 字符串
# 递归
# 循环
# 值类型
# 布尔类型
# 算法
# 布尔
# 遍历
# 键名
# 适用于
# 可在
# 已在
# 可直接
# 如需
# 表单
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
高防服务器租用指南:配置选择与快速部署攻略
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
免费网站制作appp,免费制作app哪个平台好?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
EditPlus中的正则表达式实战(6)
详解Huffman编码算法之Java实现
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
在线制作视频网站免费,都有哪些好的动漫网站?
三星、SK海力士获美批准:可向中国出口芯片制造设备
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel怎么为数据库表字段添加索引以优化查询
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
手机软键盘弹出时影响布局的解决方法
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何在IIS中新建站点并配置端口与物理路径?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
香港网站服务器数量如何影响SEO优化效果?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
大学网站设计制作软件有哪些,如何将网站制作成自己app?
香港服务器租用每月最低只需15元?
Linux系统命令中screen命令详解
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
JavaScript数据类型有哪些_如何准确判断一个变量的类型
jquery插件bootstrapValidator表单验证详解
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
html如何与html链接_实现多个HTML页面互相链接【互相】
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
如何获取上海专业网站定制建站电话?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
如何用腾讯建站主机快速创建免费网站?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
高端企业智能建站程序:SEO优化与响应式模板定制开发
个人网站制作流程图片大全,个人网站如何注销?
php json中文编码为null的解决办法
微信小程序 wx.uploadFile无法上传解决办法
如何在云主机快速搭建网站站点?

