• 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;
            }
        }
    ?>

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

       

  • 相关阅读:
    DEVMODE 结构体
    VS2019如何将主菜单从标题栏移到单独一行
    最近学到的东西
    线上问题处理相关思考
    mybatis+spring
    jenkins
    自动化case校验点
    Sqlserver大数据迁移,导出-》导入(BULK INSERT)
    阿里P7大佬带你解密Sentinel
    《高可用系列》-限流神器Sentinel,不了解一下吗?
  • 原文地址:https://www.cnblogs.com/picaso/p/3445468.html
Copyright © 2020-2023  润新知