最近遇到一个功能的开发,大致意思就是根据用户输入的条件,进行相关的比较操作。本来打算使用用户选择运算符的方式,但是后来结合项目实际,发现需要使用用户输入的自定义运算比较现实一点。大致意思就是:
1、用户输入:
a.多条直接为或的关系(用户输入)
time>12time=9
b.单条并的关系(用户输入)
time>12&&time<25
c.可用比较运算符(>、<、<=、=、!=)
d.要求比较的对象卸载前边。
2、根据实际需求,写出以下两个函数:
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; } }?>
望见者多指正,请不要冰冷的掠过~