我有一套涉及比较运算符的规则.我想根据存储在规则中的比较运算符的值来执行一些任务.我是按照以下方式进行的,但它无法正常工作.请检查以下代码
if($benRules[$i]['amountCriteria']=='Greater than')
$comparison='>';
if($benRules[$i]['amountCriteria']=='Equal to')
$comparison='==';
if($benRules[$i]['amountCriteria']=='Less than')
$comparison='<';
if($value['1'].$comparison.$value[$i]['2']){
debug('Condtion checked');
}
Run Code Online (Sandbox Code Playgroud)
问题是它总是检查条件是否为真.它将IF条件中的整个参数作为字符串,只要该字符串不为空就执行括号内的代码.请帮帮我.
您的问题是您尝试使用字符串作为代码而不进行评估.您可以像这样使用create_function():
$sCondition = '<';
$mData0 = 4;
$mData1 = 5.5;
$fnCallback=create_function('$x, $y', 'return $x'.$sCondition.'$y;');
var_dump($fnCallback($mData0, $mData1)); // true
Run Code Online (Sandbox Code Playgroud)
或者,有一个eval()函数,但似乎直接返回将在您的情况下更有用.
它总是评估为true,因为您只是在评估字符串的存在(您无法在PHP中以这种方式构造逻辑语句).
要实现您正在尝试的目标,您需要使用switch语句(对于每个潜在的比较运算符,您只需要一对一匹配),就像这样......
switch ($comparison) {
case '<': { if($value['1'] < $value[$i]['2']) { ... } break; }
case '==': { if($value['1'] == $value[$i]['2']) { ... } break; }
case '>': { if($value['1'] > $value[$i]['2']) { ... } break; }
}
Run Code Online (Sandbox Code Playgroud)
...或使用eval来解析逻辑.如果使用eval方法看起来很简单,但正如PHP手册所承认的那样:
eval()语言构造非常危险,因为它允许执行任意PHP代码.因此不鼓励使用它.如果您已仔细验证除了使用此构造之外没有其他选项,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它.
因此,如果您不了解所涉及的风险,请坚持使用切换方法.也就是说,使用eval的基本解决方案类似于以下内容:
eval('return ' . $value['1'] . $comparison . $value[$i]['2'] . ';');
Run Code Online (Sandbox Code Playgroud)