如何在PHP数组上正确构建“类似标准”的过滤器?

时间:2016-01-12 13:52:45

标签: php arrays

如何为PHP数组构建类似Criterion(就像我们对Hibernate(Java)的过滤)?

小解释

这里我构建了一个基本的“Criterion”对象来动态地为SQL字符串语句添加条件,就像这样(select *只是一个示例,为了简单起见):

public function GetAll($where_hashmap = null, Closure $optionalFn = null)
{
    // function that retrieve table name from concrete class implementation
    $table = $this->getTableName();

    $sql = "select * from {$table}";
    $params = array();
    if ($where_hashmap != null)
    {
        $sql .= " where 1=1";
        for ($i = 0; $i < count($where_hashmap); $i++)
        {
            $column = $where_hashmap[$i]["column"];
            $logic = $where_hashmap[$i]["logic"]; // AND, OR, NOT, ...
            $comparator = $where_hashmap[$i]["comparator"]; // <, <=, >, >=, =, !=, IN ...
            $value = $where_hashmap[$i]["value"];
            $sql .= " {$logic} {$column} {$comparator} ? "; // i.e. AND column <= ?
            array_push($params, $value);
        }
    }
    // function that take the SQL statement, parameters and an optional function, 
    // prepare and execute the statement
    return $this->Query($sql, $params, $optionalFn); 
}

这有点简单,因为我们正在为SQL字符串动态添加条件。但现在,我需要对内存数组执行此操作。 PHP的array_filter()函数在“我们自己编程”回调(条件)函数(如下面的示例,来自docs

时做得非常好
array_filter($arr, function($v, $k) {
    return $k == 'b' || $v == 4; // all our criteria from $where_hashmap should be here
}, ARRAY_FILTER_USE_BOTH);

如果不对逻辑关系操作和关系操作的所有可能情况进行硬编码,我怎么能动态地构建if语句?我应该在运行时在PHP文件中编写一个函数吗?这种方法是否可以扩展?

提前谢谢!

0 个答案:

没有答案