使用IF条件和存储在变量中的比较运算符

时间:2013-08-12 06:59:12

标签: php html web

我有一套涉及比较运算符的规则。我想根据存储在规则中的比较运算符的值来执行一些任务。我是按照以下方式进行的,但它无法正常工作。请检查以下代码

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条件中的整个参数作为字符串,只要该字符串不为空即执行括号内的代码。 请帮帮我。

6 个答案:

答案 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'].';')){

}