带有运算符的PHP查询/比较方法

带有运算符的PHP查询/比较方法,php,comparison,operators,Php,Comparison,Operators,我的PHP页面在每次加载时都有一系列变量;它们的值决定显示哪些小部件。每个小部件都设置了显示时间的标准 例如。显示小部件“A”,其中: 页面==1,页面!=3,用户>9,排名!=蓝色 在这个场景中,我编写了一个简单的方法——它定义查询并对每个条件进行比较,一旦遇到FALSE,它就会停止。问题是我的引擎不支持“或”操作符。必须满足每一项标准。我无法理解如何将操作员添加到其中 “页面==1 | |页面==2&&page!=3&&user>9 | | user==3&&rank!=blue” 这将使我

我的PHP页面在每次加载时都有一系列变量;它们的值决定显示哪些小部件。每个小部件都设置了显示时间的标准

例如。显示小部件“A”,其中:

页面==1,页面!=3,用户>9,排名!=蓝色

在这个场景中,我编写了一个简单的方法——它定义查询并对每个条件进行比较,一旦遇到FALSE,它就会停止。问题是我的引擎不支持“或”操作符。必须满足每一项标准。我无法理解如何将操作员添加到其中

“页面==1 | |页面==2&&page!=3&&user>9 | | user==3&&rank!=blue”

这将使我在小部件何时显示方面有更大的灵活性,而不必为不同的场景制作大量重复的小部件。我看到了SQL必须如何运行查询和我想如何查询变量之间的相似之处——是否有一个预先编写好的引擎可以使用,或者我的命运是编写一个完整的引擎来计算小部件是否满足条件


提前感谢您,Craig。

扩展您的语言以支持或

将看起来像(CNF):

如果要简化解析,可以执行以下操作:

(page==1 || page==2) && (page!=3) && (user>9 || user==3) && (rank !=blue)

DNF看起来像:

(page==1 && page!=3 && user>9 && rank!=blue)
||
(page==2 && page!=3 && user>9 && rank!=blue)
||
(page==1 && page!=3 && user==3 && rank!=blue)
||
(page==2 && page!=3 && user==3 && rank!=blue)


CNF在这里似乎更自然。

另一个可行的解决方案(比eval更安全)可能是使用parse_str的一些组合将动态变量转换为可比较的变量-但是我不确定在没有eval的情况下如何仍然生成动态if语句。

您的语言现在是什么样子,你想支持什么呢?
if
?@AbraCadaver有什么问题?如果“if”语句可以从小部件中的查询动态生成,那就太完美了。小部件的查询作为字符串保存在数据库中。我假设如果我把它放到if语句中,它只会将它看作一个字符串并返回false,因为该字符串不是布尔值value@Halcyon目前,它看起来像“页面==1,页面!=3,用户>9,排名!=blue”,并且检查每个条件,如果它们都满足,则显示小部件。我希望支持OR运算符(可能还支持使用括号的分组语句,如IF语句或SQL查询)。我现在会尝试将我的PHP添加到OP中。好的,那就选择CNF吧:-没有必要偏离多年的良好实践。如果我理解你所说的,我就理解CNF是什么(基本上就是语句的结构)-我只是不理解如何动态地使用它们。如何将字符串转换为PHP可以处理的可执行CNF?您需要解析它。CNF解析器并不十分复杂。我曾试着在谷歌上给“CNF解析器”一个标签,但我又画了一个空白——我怀疑CNF解析器是我几乎要自己开发的,这是我遇到麻烦的部分。你能推荐一些我可以看的预先写好的吗?或者甚至是一个更好的方式让我搜索一个你能发布你到目前为止有什么吗?
(page==1 || page==2) && page!=3 && (user>9 || user==3) && rank !=blue
(page==1 || page==2) && (page!=3) && (user>9 || user==3) && (rank !=blue)
(page==1 && page!=3 && user>9 && rank!=blue)
||
(page==2 && page!=3 && user>9 && rank!=blue)
||
(page==1 && page!=3 && user==3 && rank!=blue)
||
(page==2 && page!=3 && user==3 && rank!=blue)