当前位置: 首页 > news >正文

PHP——自定义比较算法

很多时候,程序都是直接写好逻辑运算,提供给用户的是一个值,然后后台去比较;但是有时会提供一种类似计算器一样的交互方式的时候,PHP只能读懂用户的输入来进行比较了~

最近的一个项目涉及到一个由用户自定义输入比较方法,后台取相应数据,自动比较,输出结果。比如:

用户输入:   time>9&&time<15

后台执行:  读懂输入,获取数据,进行比较,输出比较的结果

 

看了需求,完全就是模拟PHP比较运算与数据库操作啊,干吧~~

<?php
    $datas = json_decode(file_get_contents(INDEXJSON),true);// Global Var
    // print_r($da);


    $condition = 'size>102400&&dir%/var/www/html/wordpress/wp-admin';
    print_r(compare($condition));


    // getdata for compare
    function compare($condition){
        global $datas;
        $result = array();
        $keys = explode(',', INDEXFORMAT);
        if (!strpos($condition, '&&')) {
            $conditions = $condition;
        }else{
            $conditions = explode('&&', $condition);
        }
        for($k = 0 ; $k < count($datas['name']) ; $k++) {
            $flag = true;
            foreach ($conditions as $subCondition) {
                if (!getCompare($k, $subCondition)) {
                    $flag = false;
                    break;
                }
            }
            if ($flag) {
                $result[] = $k;
            }
            
        }
        return $result;// return keys array in datas
    }

    function getCompare($key, $condition){
        global $datas;
        if(!preg_match('/[<>=!%]+/', $condition, $operator)){    //$operator[0] 
            return false;
        }
        $value = explode($operator[0], $condition);//x>12  =>  12($value)
        switch ($operator[0]) {
            case '>':
                return ($datas[$value[0]][$key] > $value[1]);
                break;
            case '>=':
                return ($datas[$value[0]][$key] >= $value[1]);
                break;
            case '<':
                return ($datas[$value[0]][$key] < $value[1]);
                break;
            case '<=':
                return ($datas[$value[0]][$key] <= $value[1]);
                break;
            case '==':
                return ($datas[$value[0]][$key] == $value[1]);
                break;
            case '<>':
                return ($datas[$value[0]][$key] <> $value[1]);
                break;
            case '!=':
                return ($datas[$value[0]][$key] != $value[1]);
                break;
            case '%':
                if(strpos($datas[$value[0]][$key], $value[1]) === false){
                    return false;
                }else{
                    return true;
                }
                break;
            default:
                return false;
                break;
        }
    }

 

 

注:$data数组格式为  

 

---------- PHP Debugger ----------
Array
(
[name] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
)

[dir] => Array
(
[0] => F
[1] => E
[2] => D
[3] => C
[4] => B
[5] => A
)

[time] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)

)

相关文章:

  • 【转】Python 内置函数 locals() 和globals()
  • Openssl加密解密应用
  • 敏捷开发的6个实战经验
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • MySQL通过命令导出导入数据和表
  • python列表中的深浅copy
  • mysql高可用方案之主从架构(master-slave)
  • 中国HBase技术社区第二届MeetUp ——HBase技术解析及应用实践
  • Centos 7.4 安装 Redis 全过程
  • cocos2d-x引擎库binary版本制作(Windows环境)
  • 解决jsfl 弹出警告
  • 基于HTML5技术的电力3D监控应用(一)
  • zabbix安装源
  • 教你在 OSX 下最简单搭建 Clojure 开发环境的步骤
  • Java命令学习系列(七)——javap
  • JavaScript-如何实现克隆(clone)函数
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Akka系列(七):Actor持久化之Akka persistence
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • express如何解决request entity too large问题
  • Hibernate【inverse和cascade属性】知识要点
  • HTTP 简介
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java-详解HashMap
  • magento2项目上线注意事项
  • php面试题 汇集2
  • Rancher如何对接Ceph-RBD块存储
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • uva 10370 Above Average
  • 创建一种深思熟虑的文化
  • 大数据与云计算学习:数据分析(二)
  • 关于for循环的简单归纳
  • 汉诺塔算法
  • 检测对象或数组
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 人脸识别最新开发经验demo
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 推荐一个React的管理后台框架
  • 系统认识JavaScript正则表达式
  • 字符串匹配基础上
  • ionic入门之数据绑定显示-1
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (¥1011)-(一千零一拾一元整)输出
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Python第六天)文件处理
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET学习全景图
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /run/containerd/containerd.sock connect: connection refused