PHP —— 识别运算符实现逻辑比较

时间:2022-10-13 22:11:15

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

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 "\n",$value,"\n";


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

 

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