我有一套涉及比较运算符的规则。我想根据存储在规则中的比较运算符的值来执行一些任务。我是按照以下方式进行的,但它无法正常工作。请检查以下代码
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');
}
问题是它总是检查条件是否为真。它将IF条件中的整个参数作为字符串,只要该字符串不为空即执行括号内的代码。 请帮帮我。
答案 0 :(得分:6)
您的问题是您尝试使用字符串作为代码而不进行评估。您可以像这样使用create_function():
$sCondition = '<';
$mData0 = 4;
$mData1 = 5.5;
$fnCallback=create_function('$x, $y', 'return $x'.$sCondition.'$y;');
var_dump($fnCallback($mData0, $mData1)); // true
或者,有一个eval()函数,但似乎直接返回对你的情况更有用。
答案 1 :(得分:5)
它总是计算为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; }
}
...或使用eval来解析逻辑。如果使用eval方法似乎是明智的,但正如PHP手册所承认的那样:
eval()语言结构非常危险,因为它允许 执行任意PHP代码。因此不鼓励使用它。如果你 仔细确认除了使用它之外别无选择 构建时,要特别注意不要传递任何用户提供的数据 没有事先正确验证它就进入它。
因此,如果您不了解所涉及的风险,请坚持使用切换方法。也就是说,使用eval的基本解决方案类似于以下内容:
eval('return ' . $value['1'] . $comparison . $value[$i]['2'] . ';');
答案 2 :(得分:1)
$str = "$result = (bool)($value['1'] $comparison $value[$i]['2']);";
eval($str);
if($result){
//true
}
您可以使用eval(),但这也有效:
if($benRules[$i]['amountCriteria']=='Greater than'){
$comparison = (bool)($value['1'] > $value[$i]['2']);
}
if($benRules[$i]['amountCriteria']=='Equal to'){
$comparison = (bool)($value['1'] == $value[$i]['2']);
}
if($benRules[$i]['amountCriteria']=='Less than'){
$comparison = (bool)($value['1'] < $value[$i]['2']);
}
if($comparison){
debug('Condtion checked');
}
修改强>
这看起来更好
答案 3 :(得分:1)
如果没有某种魔法,这种构造是不可能的,create_function()
或eval()
。
但是,您也可以使用闭合来实现您想要的效果;返回基于您要使用的运算符的比较函数。你可以认为这是战略模式的廉价版本:
function getComparisonFunction($operator)
{
// comparison function is returned
return function($a, $b) use ($operator) {
if ($operator == 'Greater than') {
return $a > $b;
} elseif ($operator == 'Equal to') {
return $a == $b;
} else { // Less than
return $a < $b;
}
}
}
// get comparison function
$fn = getComparisonFunction($benRules[$i]['amountCriteria']);
// use comparison function
if ($fn($value['1'], $value[$i]['2'])) {
debug('Condtion checked');
}
答案 4 :(得分:0)
if($benRules[$i]['amountCriteria']=='Greater than')
$comparison='>';
if($benRules[$i]['amountCriteria']=='Equal to')
$comparison='==';
if($benRules[$i]['amountCriteria']=='Less than')
$comparison='<';
eval('$bool = $value[\'1\']'.$comparison.'$value[$i][\'2\'];');
if($bool){
debug('Condtion checked');
}
答案 5 :(得分:0)
您可以使用eval
功能
if (eval('return '.$value['1'].$comparison.$value[$i]['2'].';')){
}