2011-12-13 104 views
1

這是一個棘手的解釋。我有一個關聯數組,我想運行一組規則來返回true或false。匹配式(SQL'ish)針對PHP陣列返回真或假

我在想,如果有什麼地方讓我比較的規則對數組庫(或一組)。幾乎像SQL exept我有記錄,我只需要看看SQL是否會返回它。

例如:

$subject = array('name' => 'John Smith', 'age' => '44'); 
$formula = "name LIKE 'John%' AND (age = 44 OR age = 45)"; 
if(match($formula, $subject)) 
return true; 
else 
return false; 

主題陣列是不是從一個數據庫,它實際上是從一個表單提交,否則我會運行的SQL,如果返回正確的記錄那麼這將是真實的。此外,這是我想用很多可能不同的關聯數組,所以添加到表中,然後運行查詢來獲取相同的記錄是不可能的。基本上我不能使用數據庫。

+0

這裏的困難將被解析`$ formula` - 哪裏該字符串從何而來?你可以改變格式,或者(理想情況下)使用數組? – DaveRandom 2011-12-13 17:09:28

回答

0

如果你想要一個表達式解析,好像它是SQL,然後使用SQL語法分析程序....

$subject = array('name' => 'John Smith', 'age' => '44'); 
$formula = "'name' LIKE 'John%' AND ('age' = '44' OR 'age' = '45')"; 
$result=try_expression($subject, $formula); 

function try_db_expression($subject, $formula) 
{ 
$keys=array_keys($subject); 
$vals=array_values($subject); 

foreach ($keys as $k=>$v) { 
    $keys[$k]='/\b' . mysql_real_escape_string($v) . '\b/i'; 
} 
foreach ($vals as $k=>$v) { 
    $vals[$k]=mysql_real_escape_string($v); 
} 
$test=preg_replace($keys, $vals, $subject); 
$res=mysql_query("SELECT ($test) AS evald"); 
if ($r=mysql_fetch_assoc($res)) return $r['evald']; 
return false; 
} 

基本上我不能使用一個數據庫

然後你必須構建你自己的解析器(不是真的 - 你可以使用PHP的eval--但你需要將LIKE運算符映射到PHP函數)。

1

也許你可以做這樣的事情?

function match ($subject, $formula) { 
    extract($subject); 
    foreach ($formula as $rule) { 
    if (!eval("return $rule;")) return FALSE; 
    } 
    return TRUE; 
} 

$formula = array(
    'substr($name,0,4) == "John"', 
    '$age == 44 OR $age == 45' 
); 
$subject1 = array('name' => 'John Smith', 'age' => '44'); 
$subject2 = array('name' => 'Bob Jones', 'age' => '42'); 

var_dump(match($subject1, $formula)); // bool (TRUE) 
var_dump(match($subject2, $formula)); // bool (FALSE) 

這種方法意味着您的規則可以像您喜歡的那樣複雜;例如,上述$formula可以壓縮成這一個規則:

$formula = array(
    'substr($name,0,4) == "John" AND ($age == 44 OR $age == 45)' 
); 

因爲它的工作方式,多條規則有效地具有AND關係 - 只要一個規則失敗,函數返回false。

你可以寫東西喜歡,使用任何你喜歡的PHP函數,只要它是一個有效的比較表達式。

0

有這樣幾個實現。你基本上正在尋找「PHP中的LINQ」,並且它可以用於數組數據集。 PHPLinq

他們大多使用更ORM式查詢方法,而不是SQL解析器。 (你可以從http://www.phpinsider.com/php/code/SafeSQL/http://pear.php.net/package/SQL_Parser得到)

你可以用遞歸正則表達式模仿SQL表達式。但是你不能用preg_match或_replace_callback輕鬆解析和處理它們。除非你真的只有這樣簡單的例子,否則我不會打擾。