首页 > 解决方案 > PHP /比较两个包含条件的语句以获取它是真还是假

问题描述

我正在尝试比较 PHP 中的两个语句。之后我需要检查他们的输出是真还是假。

我将首先用一个小例子进行解释,以获得更多说明。假设我们有:

$statement1 = '(p == 5 || p == 8) && (r == 01 || r == 06)';
$statement2 = '(p == 5)(r == 01)'; // yes, it doesn't contain an && 

我需要将 $statement2 与 $statement1 进行比较并将结果为真,因为根据 $statement1 的第一部分 (p == 5 || p == 8) AND (r == 01) 在 $statement2 中根据 $statement1 的第二部分 (r == 01 || r == 06) 为真。所以简而言之,我应该对这些陈述做出正确的判断。

所以我想到的是取两个语句的括号之间的值并将它们存储在数组中,代码如下

PS: $text_outside 是在需要时创建的

function extract($string)
   {
    $text_outside=array();
    $text_inside=array();
    $t="";
    for($i=0;$i<strlen($string);$i++)
    {
        if($string[$i]=='(')
        {
            $text_outside[]=$t;
            $t="";
            $t1="";
            $i++;
            while($string[$i]!=')')
            {
                $t1.=$string[$i];
                $i++;
            }
            $text_inside[] = $t1;

        }
        else {
            if($string[$i]!=')')
            $t.=$string[$i];
            else {
                continue;
            }

        }
    }
    if($t!="")
    $text_outside[]=$t;

    return $text_inside; 
  }

这将适用于两种陈述。然后,我将遍历为比较而创建的数组。但后来我被困住了。我无法比较这两种说法来判断它是真是假。

这是剩下的部分:

$extractedStatement1[] = extract($statement1);
$extractedStatement2[] = extract($statement2);

foreach ($statement2 as $val2){
    foreach ($statement1 as $val1){
        //I am stuck here
    }
}

如果 $statement2 根据 $statement1 是真还是假,我需要在最后得到。我也对其他方法持开放态度。

标签: php

解决方案


转换为关联数组后,您可以使用Symfony 的 ExpressionLanguage 组件:$statement2var -> value

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$statement1 = '(p == 5 || p == 8) && (r == 01 || r == 06)';
$statement2 = '(p == 5)(r == 01)';

$assignments = [];
if (preg_match_all('/\((\w+) == (\w+)\)/', $statement2, $matches, PREG_SET_ORDER)) {
  foreach ($matches as [, $var, $val]) {
    $assignments[$var] = $val;
  }
}

$expressionLanguage = new ExpressionLanguage();
var_dump($expressionLanguage->evaluate($statement1, $assignments));  // true

演示

编辑:如果您也需要处理!=,那么应该执行以下操作:

$assignments = [];
if (preg_match_all('/\((\w+) ([!=])= (\w+)\)/', $statement2, $matches, PREG_SET_ORDER)) {
  foreach ($matches as [, $var, $operator, $val]) {
    $assignments[$var] = $operator === '=' ? $val : null;
  }
}

推荐阅读