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

时间:2023-03-09 02:25:27
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 "\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;
}
}
?>

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