【问题标题】:PHP Query/Comparison Method with Operators带运算符的 PHP 查询/比较方法
【发布时间】:2014-06-14 06:37:20
【问题描述】:

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

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

"page==1, page!=3, user>9, rank!=blue"

$myVars = array();
$myVars['page'] = 1;
$myVars['user'] = 99;
$myVars['rank'] = 'red';

在这种情况下,我编写了一个简单的方法 - 它界定了查询并对每个条件进行比较,并在遇到 FALSE 时立即停止。问题是我的引擎不支持“OR”运算符。必须满足每一个标准。而且我无法弄清楚如何将运算符添加到其中。

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

这将使我在显示小部件时更加灵活,而无需为不同的场景制作大量重复的小部件。我看到 SQL 必须如何运行查询和我想如何查询我的变量之间存在相似之处 - 是否有一个我可以使用的预先编写的引擎,或者我的命运是否注定要编写一个完整的引擎来解决一个小部件是否符合标准?

在此先感谢克雷格。

【问题讨论】:

  • 你的语言现在是什么样的,你想支持什么?
  • if 有什么问题?
  • @AbraCadaver - 如果可以从小部件中保存的查询动态生成“IF”语句 - 那将是完美的。小部件的查询作为字符串保存在数据库中。我假设如果我将它放入 IF 语句中,它只会将其视为字符串并返回 false,因为该字符串不是布尔值
  • @Halcyon 目前看起来像 "page==1, page!=3, user>9, rank!=blue" 并且检查每个条件,如果它们都满足,则显示小部件。我想支持 OR 运算符(可能还支持使用括号的分组语句,如 IF 语句或 SQL 查询)。我将尝试将我的 PHP 添加到刚才的 OP 中。
  • 好吧,那就去 CNF:en.wikipedia.org/wiki/Conjunctive_normal_form - 无需偏离多年的良好实践。

标签: php comparison operators


【解决方案1】:

扩展您的语言以支持Conjunctive Normal FormDisjunctive Normal Form

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

看起来像(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)

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 在这里看起来更自然。

【讨论】:

  • 如果我明白你在说什么,我就明白 CNF 是什么(基本上就是 IF 语句的结构)——我只是不明白如何动态使用它们。如何将字符串转换为 PHP 可以处理的可执行 CNF?
  • 你需要解析它。 CNF 解析器并不是非常复杂。
  • 我试过给“CNF 解析器”一个谷歌,但我又画了一个空白 - 我怀疑 CNF 解析器是我几乎试图自己开发的,这就是我遇到麻烦的部分和。你能推荐一些我可以看的预先写好的吗?甚至是我搜索的更好方法
  • 你能发布你目前所拥有的吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2018-05-27
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多