包下载地址:https://github.com/K-Phoen/rulerz
composer安装:composer require 'kphoen/rulerz'
使用:
use RulerZ\Compiler\Compiler;
use RulerZ\RulerZ;
use RulerZ\Target\Native\Native;
public function getRulerZChecker()
{
$compiler = Compiler::create();
$rulerz = new RulerZ($compiler, [
new Native([
'length' => 'strlen'
],[
'contains' => function ($a, $b) {
return sprintf('strstr(%s, %s)', $a, $b);
}
])
]);
return $rulerz;
}
我们需要搜索、校验的数据:
1、批量匹配,
$datas = [
['pseudo' => 'Joe', 'fullname' => 'Joe la frite', 'gender' => 'M', 'points' => 20],
['pseudo' => 'Moe', 'fullname' => 'Moe, from the bar!', 'gender' => 'M', 'points' => 200],
['pseudo' => 'hazel', 'fullname' => 'hazel, from the hazel!', 'gender' => 'M', 'points' => 100],
['pseudo' => 'Alice', 'fullname' => 'Alice, from... you know.', 'gender' => 'F', 'points' => 100],
['pseudo' => 'Alice', 'fullname' => 'Alice, from... you know.', 'gender' => 'F', 'points' => 20],
];
$rule = "gender = :gender and points > :min_points";
$parameters = [
'min_points' => 30,
'gender' => 'M',
];
$rulerz = $this->getRulerZChecker();
$result = iterator_to_array(
$rulerz->filter($datas, $rule, $parameters) // the parameters can be omitted if empty
);
最后的到的结果
array(2) {
[0]=>
array(4) {
["pseudo"]=>
string(3) "Moe"
["fullname"]=>
string(18) "Moe, from the bar!"
["gender"]=>
string(1) "M"
["points"]=>
int(200)
}
[1]=>
array(4) {
["pseudo"]=>
string(5) "hazel"
["fullname"]=>
string(22) "hazel, from the hazel!"
["gender"]=>
string(1) "M"
["points"]=>
int(100)
}
}
2、判断数据是否符合要求:
$rulerz->satisfies($data, $rule, $parameters);
// 返回布尔值,true表示满足
$data =['pseudo' => 'Moe', 'fullname' => 'Moe, from the bar!', 'gender' => 'M', 'points' => 200];
$rule = "gender = :gender and points > :min_points";
$parameters = [
'min_points' => 30,
'gender' => 'M',
];
$rulerz = $this->getRulerZChecker();
$result = $rulerz->satisfies($data, $rule, $parameters);//bool(true)
上文中contains
表示的是用系统函数strstr()
来判断$a中是否包含$b字符,由于编译后的代码是通过字符串生成的,所以你在这个匿名函数中必须要用字符串表达判断逻辑,这也是其缺点之一。