php - 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 是真还是假,我需要在最后得到。我也对其他方法持开放态度。
解决方案
转换为关联数组后,您可以使用Symfony 的 ExpressionLanguage 组件:$statement2
var -> 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;
}
}
推荐阅读
- hibernate - Spring boot 数据 + Oracle = 实体批量更新不起作用
- python - Folium 离线热图不呈现(无错误)
- tomcat - Httpd 与 Tomcat 9 的集成
- git - 当合并回来删除文件时,git revert merge
- html - 为什么导航栏后没有显示我的文字?
- php - 如何使用php在模态中检索html img标签中的图像
- docker - Docker 从附加容器中退出
- powershell - 如何通过管道将目录名称传递给 Set-Location cmdlet?
- python - 如何查找从根到节点的路径(python 3.6)
- php - Laravel 多对多中间表