匹配公式(SQL'ish)对PHP数组返回true或false

时间:2011-12-13 16:59:35

标签: php regex match

这是一个难以解释的问题。我有一个关联数组,我想运行一组规则来返回true或false。

我想知道是否有某个库允许我将规则(或一组)与数组进行比较。几乎像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,如果它返回了正确的记录,那么它就是真的。另外,这是我想与不同的关联数组一起使用的东西,因此添加到表然后运行查询以获得相同的记录也是不可能的。基本上我不能使用数据库。

3 个答案:

答案 0 :(得分: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函数编写任何类似的东西。

答案 1 :(得分: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函数)。

答案 2 :(得分:0)

有一些这样的实现。您基本上是在寻找“LINQ in PHP”和一个适用于数组数据集的方法。 PHPLinq

他们中的大多数使用更像ORM的查询方法,而不是SQL解析器。 (您可以从http://www.phpinsider.com/php/code/SafeSQL/http://pear.php.net/package/SQL_Parser获得

您可以使用递归正则表达式模仿SQL表达式。但是你不能轻易地解析并使用preg_match或_replace_callback处理它们。除非你真的只有这么简单的例子,否则我不会打扰。