首先抛出一个问题:

// 前端输入的字符
$logic = ">=";
// 根据输入的字符执行if判断
if ($a . $logic . $b){// do something
}else{// do something
}

假设 $a 与 $b 之间的逻辑判断不能确定,要怎么才能动态添加判断条件呢?

解决方案1:
使用PHP的 eval() 把字符串转化为代码执行

// 前端输入的字符
$logic = ">=";
// 构造判断条件字符串
$str = 'return '.$a.' '.$logic.' '.$b.';';
$result = @eval($str);
if ($result ){// do something
}else{// do something
}
  • eval()需要添加return才会返回结果,否则会返回null。结束符分号是必须的。
  • 如果只是简单的判断,使用eval()确实会比较方便一些,但是当判断的条件复杂了,可读性就会下降。
  • eval()可以执行任何php代码,所以会很危险,甚至有些系统关闭了eval()的使用(需要在php.ini中开启)。

解决方案2:
设定好判断的条件类型,封装每种类型对应的函数。判断时,根据类型调用函数进行判断。

// 大于等于
function egt($a, $b){return $a >= $b;
}
// 小于等于
function elt($a, $b){return $a <= $b;
}
...// 前端选择的判断类型
$logic = "egt";
// 根据类型调用对应的方法
$result = cal_user_func($logic, $a, $b);
  • 多参数也可使用 call_user_func_array()

实例:店铺会员卡等级规则判断的实现

根据上面得到的结果,我们可以用来实现会员等级规则的判断。(使用方案2实现)

上图是自定义规则的设置页面,其中主要关注的是条件的设置,有满足一种条件满足全部条件两种选项。
根据方案2,首先确定条件的数据结构(json):

{"name": "满足其中一个条件","value": "or","condition": [{"variable": "charge","variable_name": "会籍期间累计储值","range": "egt","range_name": "大于或等于","value": ["1000"]},{"variable": "score","variable_name": "会籍期间累计积分","range": "egt","range_name": "大于或等于","value": ["1000"]},{"variable": "night","variable_name": "会籍期间累计房晚","range": "elt","range_name": "小于或等于","value": ["10"]},{"variable": "consume","variable_name": "累计消费","range": "between","range_name": "介于之间","value": ["2000","3000"]}]
}

封装判断函数

function egt($a, $b){return $a >= $b;
}
function elt($a, $b){return $a <= $b;
}
function between($a, $b, $c){return $a >= $b && $a <= $c;
}// 规则验证方法
public function verify_rule($rule, $charge, $score, $night, $consume){$rule = json_decode($rule, true);$res_arr = [];$condition_num = count($rule['condition']);foreach ($rule['condition'] as $val){// 需要比对的条件参数$params = $val['value'];// 添加比对数值if (!isset(${$val['variable']})) continue;array_unshift($params, ${$val['variable']});if (function_exists($val['range'])){// 调用判断函数,保存判断结果$res_arr[] = call_user_func_array($val['range'], $params);}}$result = array_sum($res_arr);if ($rule['value'] == 'and' && $result == $condition_num){return true;}elseif($rule['value'] == 'or' && $result > 0){return true;}else{return false;}
}
  • 根据条件的数据结构,我们需要传入四个比对值(累计储值、累计积分、累计房晚、累计消费)。注意:数据结构中 condition.variable 与传入的参数名需一致,因为在验证方法中,我们使用了可变变量
  • 同时还需要保证存在与condition.range同名的函数。

如果想用方案1实现,这里提醒一下,and和or,与&&和||得到的结果是不一样的,拼接字符串的时候最好还是转换一下

PHP实现自定义if条件、动态if条件判断(店铺会员卡等级规则判断的实现)相关推荐

  1. 基于layui的动态添加条件查询ui插件

    layuiExtend 项目介绍 最近做一个档案系统,发现字段超多,查询页面布局不是很好弄,于是就想着干脆写一个动态添加条件的ui插件. 因为是用的layui框架写的系统,所以就直接基于layui编写 ...

  2. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  3. linq之InnerJoin和LeftJoin以及封装动态查询条件版本

    Linq的出现,使数据集的处理显得愈来愈简便.很多时候对于本地数据集的处理,脑海中的第一反应,即尝试使用Linq来实现.诸如DataTable的innerJoin以及leftJoin等操作,很多时候我 ...

  4. ibatis动态查询条件(转载待完善)

    ibatis动态查询条件(转载待完善) IBatis 动态查询条件 下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回hash表\动态sql <statement ...

  5. WINFORM 多条件动态查询 通用代码的设计与实现

    经常碰到多条件联合查询的问题,以前的习惯认为很简单总会从头开始设计布局代码,往往一个查询面要费上老半天的功夫,而效果也不咋地.     前段时间做了个相对通用的多条件动态查询面,复用起来还是挺方便的, ...

  6. ibatis动态查询条件

    ibatis的调试相对困难,出错的时候主要依据是log4生成的log文件和出错提示,这方面要能比较熟练的看懂. 下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回has ...

  7. element手机验证格式_基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)...

    前言 开发过程中遇到了一个需求,根据用户选择的联系方式,动态改变输入框的检验条件,并且整个表单是可以增加的 在线访问:动态表单校验 github(欢迎star): https://github.com ...

  8. vue 之url拼接 根据选择条件动态修改url地址

    vue 之url拼接 根据选择条件动态修改url地址 这里写的是某个项目中的一部分实现代码.. 如果需要学习 常见的动态路由可以看这篇文章:https://blog.csdn.net/ws199002 ...

  9. mysql 使用if函数实现多条件动态查询

    简单多条件动态查询 1.条件为NULL时,不起作用 set @iid = NULL; select * FROM t_sys_cpy WHERE IF(@iid is NULL,1=1,ID = @i ...

最新文章

  1. C# in depth 阅读笔记-- 委托
  2. svn中出现各种感叹号说明
  3. java去除字符串的html标签
  4. matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...
  5. 高盛的AI说,今年世界杯冠军是巴西
  6. 【PL/SQL】开发程序
  7. 数据分析的五个阶段及价值
  8. 跳转到高德地图或百度地图或高德网页导航
  9. 景联文科技入选全国信息技术标准化技术委员会生物特征识别技术委员会
  10. 解读:大数据分析及其数据来源
  11. 三角形面积的勾股定理
  12. MybatisPlus中乐观锁的配置
  13. 教师直播平台对比分析
  14. 《黑匣子思维:我们如何更理性地犯错》iphone部分
  15. 给密码加盐是什么东西?
  16. 电信短信网关ISAG-SMS二次开发
  17. NGINX服务器运维
  18. 游戏辅助脚本(python)
  19. 从今天开始,请叫我,新生代农民工
  20. 银行IT软件服务的公司 (不包括被收购的企业),统计国内员工人数比较多的企业

热门文章

  1. UE4 Niagara 设置粒子Z轴对齐
  2. c语言字符数组赋值超过,C语言字符数组赋值
  3. 网站漏洞扫描注入批量getshell工具
  4. 百度用心良苦 搜索页面惊现2012世界末日特效
  5. mysql having in_mysql:having 用法
  6. mysql revoke数据库_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...
  7. VB 运行时错误代码解释
  8. 排序算法-冒泡排序(可视化动图)
  9. qmx工作室秋季项目作品---2048小游戏
  10. JavaScript与Ajax开发作业