2010-11-19 56 views
0

我正在與一個商品銷售網站,每個產品在數據庫(MySQL)屬於幾個類別。我使用多對多表映射來存儲產品類別關係。解析複雜的邏輯表達式並執行搜索,在php

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

我認爲這種方法對於按類別進行的一般產品搜索是相當直接的。

但是,內部用戶將在複雜的邏輯表達式中按類別搜索產品。 例如:

輸入「(1001 + 1002)| 1005」查找屬於類別(1001和1002)或(1005)的產品。 輸入「(1001 + 1002)|(1003 + 1004)」查找屬於類別(1001和1002)或(1003和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(|)運算符和括號,並且括號總是平衡的。 (例如,每個開放式括號在查詢中必須有一個閉括號)。

任何幫助,高度讚賞。

回答

0

老實說 - 你應該重新考慮這個方法並找出數據庫爲你做這種過濾的方法。這是RDBM的設計目的。在PHP(或任何通用編程語言)中做這樣的事情將會重新發明,並且很可能非常容易出錯。

您似乎已經將解析邏輯關閉(+和AND)將產生交集(|和OR)將產生聯合。去那。

+0

Thx爲您的建議。在SQL中進行過濾是完全正確的。我關心的是如何將輸入查詢「翻譯」爲SQL或一系列PHP條件,以便我可以在SQL或PHP中執行過濾。我嘗試過使用RegExp,但它不能遞歸執行某些操作。 – LazNiko 2010-11-19 08:03:27