jgswift / filtratr
PHP 5.5+ 过滤组件
0.1.11
2015-01-24 10:51 UTC
Requires
- php: >=5.5
- jgswift/qinq: 0.1.*
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-24 16:28:25 UTC
README
过滤和映射组件
安装
使用 composer 通过 CLI 安装
php composer.phar require jgswift/filtratr:0.1.*
使用 composer.json 通过 composer 安装
{ "require": { "jgswift/filtratr": "0.1.*" } }
描述
filtratr 是一个可扩展的轻量级过滤组件,它简化了数据结构的过滤和映射。filtratr 提供了函数式编程接口和流畅的接口。
依赖
- php 5.5+
- jgswift/qinq - 准集成查询
用法
过滤
根据提供的谓词从结果中包括或排除数据。谓词可以通过函数或字符串实现。
$filter = filtratr\with([ 'foo' => 'bar', 'boo' => 'baz' ])->filter('equals',['bar']); var_dump($filter()); // ['foo' => 'bar']
是 & 不是
是
和 不是
是 过滤
的逆子集。简单的 是
语句是 过滤
的别名,以减少概念上的负担。而 不是
过滤器是 是
的逆版本,并反转应用了过滤。
$filter = filtratr\with([ 'foo' => 'bar', 'boo' => 'baz' ])->is('equals',['bar']); var_dump($filter()); // ['foo' => 'bar']
相反...
$filter = filtratr\with([ 'foo' => 'bar', 'boo' => 'baz' ])->not('equals',['bar']); var_dump($filter()); // ['boo' => 'baz']
使用回调
可以轻松地将自定义回调应用于数组或对象的每个成员。返回 true 或任何非 false 或 null 值的过滤回调将被保留在主题数组/对象中。
$filter = filtratr\with([ 'foo' => 'bar', 'boo' => 'baz' ])->is(function($val) { if($val === 'bar') { return true; } }); var_dump($filter()); // ['foo' => 'bar']
使用命名回调
在回调之前指定键名,然后仅将回调应用于匹配该键的项,并默认保留不匹配的键。
$filter = filtratr\with([ 'foo' => 'bar', 'bar' => 'baz' ])->is('foo', function($val) { if($val === 'bar') { return true; } }); var_dump($filter()); // ['foo' => 'bar', 'bar' => 'baz']
谓词 & 过滤
- equals(比较)
- identical(比较)
- greaterthan(比较)
- greaterthanorequals(比较)
- lessthan(比较)
- lessthanorequals(比较)
- validate(过滤,选项)
- serial
映射
映射使用回调函数对所选键/属性进行转换。
使用回调
类似于过滤,映射可以接收回调、可选的键模式以及回调参数数组。与过滤不同,映射不是包容的,因此映射只能有效产生转换后的值或原始值。
$filter = filtratr\with([ 'foo' => ' bar ', 'fiz' => ' buz ' ])->map(function($val) { return trim($val); }); var_dump($filter()); // ['foo' => 'bar', 'fiz' => 'buz']
可以使用任何类型的回调(字符串、闭包、数组)。以下示例与前面的示例在功能上相同
\filtratr\with([ 'foo' => ' bar ', 'fiz' => ' buz ' ])->map('trim'); var_dump($filter()); // ['foo' => 'bar', 'fiz' => 'buz']
使用命名回调
$filter = filtratr\with([ 'foo' => ' bar ', 'bar' => ' baz ' ])->map('foo', 'trim'); var_dump($filter()); // ['foo' => 'bar', 'bar' => ' baz ']
连接表达式
可以使用 |
管道操作轻松地连接映射。方法连接也是一个选项。
$filter = filtratr\with([ 'foo' => ' bar', 'fiz' => 'buz ' ]) ->map('trim | strtoupper'); var_dump($filter()); // ['foo' => 'BAR', 'fiz' => 'BUZ']
使用连接方法...
$filter = filtratr\with([ 'foo' => ' bar', 'fiz' => 'buz ' ]) ->map('trim') ->map('strtoupper'); var_dump($filter()); // ['foo' => 'BAR', 'fiz' => 'BUZ']
谓词 & 过滤
- contains
- nuller
- empty_nuller
- serializearray(array)
- unserializestring(string)
减少
与 array_reduce
类似,reduce 语句将对多个项应用回调并生成单个结果。
$filter = filtratr\with([ 1, 2, 3, 4 ])->reduce(function($a,$b) { return $a * $b; }); var_dump($filter()[0]); // 24
对象支持
尽管技术上是可行的,但 filtratr 目前仅在公共属性上进行了测试。对象是通过引用传递的,查询将假设对象是可变的。
class User { public $name; function __construct($name) { $this->name = $name; } } $user = new User(' john smith '); $filter = filtratr\with($user)->map('name', 'trim | strtoupper') var_dump($filter()->name); // "JOHN SMITH"
扩展流畅接口
扩展类...
namespace MyQueryExtension; class MyExtension extends filtratr\Query\AbstractStatement { /* do stuff here */ }
附加每个过滤扩展...
$filter = new filtratr\with([ 'foo' => 'bar' ]) ->extend('MyQueryExtension') ->myextension(); var_dump($filter());
全局附加...
filtratr\extend('MyQueryExtension'); $filter = new filtratr\with([ 'foo' => 'bar' ]) ->myextension(); var_dump($filter());