jgswift/filtratr

PHP 5.5+ 过滤组件

0.1.11 2015-01-24 10:51 UTC

This package is not auto-updated.

Last update: 2024-09-24 16:28:25 UTC


README

过滤和映射组件

Build Status Scrutinizer Code Quality Latest Stable Version License

安装

使用 composer 通过 CLI 安装

php composer.phar require jgswift/filtratr:0.1.*

使用 composer.json 通过 composer 安装

{
    "require": {
        "jgswift/filtratr": "0.1.*"
    }
}

描述

filtratr 是一个可扩展的轻量级过滤组件,它简化了数据结构的过滤和映射。filtratr 提供了函数式编程接口和流畅的接口。

依赖

用法

过滤

根据提供的谓词从结果中包括或排除数据。谓词可以通过函数或字符串实现。

$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());