【问题标题】:parse complex logic expression and do the search, in php在 php 中解析复杂的逻辑表达式并进行搜索
【发布时间】:2010-11-19 01:15:15
【问题描述】:

我正在与数据库 (MySQL) 中的每个产品都属于多个类别的商品销售网站合作。我使用多对多表映射来存储产品-类别关系。

ProductID CategoryID
1          1001
1          1002
1          1003
2          1001
2          1003
2          1005

我认为这种方法对于根据类别进行一般产品搜索非常简单。

但是,内部用户会在复杂的逻辑表达式中按类别搜索产品。 例如:

输入 "(1001+1002)|1005" 查找属于 (1001 AND 1002) OR (1005) 类别的产品。 输入 "(1001+1002)|(1003+1004)" 查找属于 (1001 AND 1002) OR (1003 AND 1004) 类别的产品。

由于查询是动态的,我觉得直接翻译成SQL不好。我的方法是检索查询中出现的 ProductIDs 和 CategoryIDs(例如“(1001+1002|1005)”):

SELECT ProductID, CategoryID FROM ProCatMap WHERE CategoryID IN (1001, 1002, 1005)

然后在 PHP 中进行最终过滤。

选择 ProductID-CategoryID 记录后,我将它们组合成一个数组,格式如下: $Relation[$ProductID] = array(CategoryID1, CategoryID2 .....);所以对于上面列出的数据,数组将是

$Relation[1] = array(1001,1002, 1003);
$Relation[2] = array(1001, 1003, 1005);

我的问题是,我应该如何编写代码来解析动态逻辑查询并对数组进行过滤。

查询只包含 AND(+) 和 OR(|) 运算符和括号,并且括号总是平衡的。 (例如,每个左括号在查询中必须有一个右括号)。

非常感谢任何帮助。

【问题讨论】:

    标签: php parsing search logic


    【解决方案1】:

    老实说 - 您应该重新考虑该方法并找出一种方法让数据库为您执行此类过滤。这就是 RDBM 的设计目的。在 PHP(或任何通用编程语言)中做这样的事情将重新发明轮子,而且很可能很容易出错。

    您似乎已经将解析逻辑关闭(+ 和 AND)将产生一个交集(| 和 OR)将产生一个并集。去吧。

    【讨论】:

    • 感谢您的建议。在 SQL 中进行过滤是完全可以的。我关心的是如何将输入查询“翻译”成 SQL 或一系列 PHP 条件,以便我可以在 SQL 或 PHP 中进行过滤。我尝试使用 RegExp,但它不能递归地做一些事情。
    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多