zoukankan      html  css  js  c++  java
  • PHP —— 识别运算符实现逻辑比较

    最近遇到一个功能的开发,大致意思就是根据用户输入的条件,进行相关的比较操作。本来打算使用用户选择运算符的方式,但是后来结合项目实际,发现需要使用用户输入的自定义运算比较现实一点。大致意思就是:

    1、用户输入:

     

    a.多条直接为或的关系(用户输入)

    time>12
    time=9

    b.单条并的关系(用户输入)

    time>12&&time<25

    c.可用比较运算符(>、<、<=、=、!=)

    d.要求比较的对象卸载前边。

    2、根据实际需求,写出以下两个函数:

    <?php
        $condition = array('time>12&&time<=25');
        var_dump(getCompare('time','18',$condition));
      //这里的比较对象“time”也可以通过用户输入获取,需要加一个正则,我这项目不需要
    
    
        // $condition :array(): mtime>24 / mtime <23  / mtime=53  / mtime=12||mtime>12
        function getCompare($name, $data, $condition){
            if (!is_array($condition)) {
                return false;
            }
            foreach ($condition as $key => $value) {
                $value = str_replace($name, '', $value);
                if (!strpos($value, '&&')) {
                    return explainCompare($data, $value);
                }else{
                    $subCon = explode('&&', $value);
                    foreach ($subCon as $v) {
                        if(!explainCompare($data,$v)){
                            return false;
                        }
                    }
                    return true;
                }
            }
        }
    
        function explainCompare($data, $condition){
            if(!preg_match('/^[<>=!%]+/', $condition, $operator)){    //$operator[0] 
                return false;
            }
            $value = str_replace($operator[0], '', $condition);//x>12  =>  12($value)
    
            echo $operator[0];
            echo "
    ",$value,"
    ";
    
    
            switch ($operator[0]) {
                case '>':
                    return ($data > $value);
                    break;
                case '>=':
                    return ($data >= $value);
                    break;
                case '<':
                    return ($data < $value);
                    break;
                case '<=':
                    return ($data <= $value);
                    break;
                case '==':
                    return ($data == $value);
                    break;
                case '<>':
                    return ($data <> $value);
                    break;
                case '!=':
                    return ($data != $value);
                    break;
                default:
                    return false;
                    break;
            }
        }
    ?>

    望见者多指正,请不要冰冷的掠过~

       

  • 相关阅读:
    Linux中find常见用法示例
    PHP写的异步高并发服务器,基于libevent
    Prototype原型模式
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    记一次皮肤过敏
    Thread类线程结束会唤醒使用其对象做锁而睡眠的线程
    位运算符
    逻辑运算符
  • 原文地址:https://www.cnblogs.com/picaso/p/3445468.html
Copyright © 2011-2022 走看看