zoukankan      html  css  js  c++  java
  • 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面向对象编程
    Python模块
    Python函数式编程(把函数作为参数传入)
    Python函数高级特性
    Python函数基础
    连续数字或英文字符文本强制换行
    flex布局文本过长不显示省略号
    在div中放一个相同大小的svg,实际显示的位置svg偏下
    设置git push默认branch
    c# using
  • 原文地址:https://www.cnblogs.com/picaso/p/3461834.html
Copyright © 2011-2022 走看看