filtering & mapping component
Install via cli using composer:
php composer.phar require jgswift/filtratr:0.1.*
Install via composer.json using composer:
{
"require": {
"jgswift/filtratr": "0.1.*"
}
}
filtratr is an extensible lightweight filtering component that facilitates filtering and mapping of data structures. filtratr provides a functional programming interface and a fluid interface.
- php 5.5+
- jgswift/qinq - quasi integrated query
Includes or excludes data from result depending on provided predicate. Predicates may be implemented functionally or through strings.
$filter = filtratr\with([
'foo' => 'bar',
'boo' => 'baz'
])->filter('equals',['bar']);
var_dump($filter()); // ['foo' => 'bar']
Is
and Not
are an inverse subset of Filter
. The Is
statement is simply an alias of Filter
to minimize conceptual overhead. The Not
filter is the inverse version of Is
and reverses whatever filtering is applied.
$filter = filtratr\with([
'foo' => 'bar',
'boo' => 'baz'
])->is('equals',['bar']);
var_dump($filter()); // ['foo' => 'bar']
Conversely...
$filter = filtratr\with([
'foo' => 'bar',
'boo' => 'baz'
])->not('equals',['bar']);
var_dump($filter()); // ['boo' => 'baz']
Custom callbacks may easily be applied to every member of an array or object. Filter callbacks that return true or any values other than false or null will be kept in the subject array/object.
$filter = filtratr\with([
'foo' => 'bar',
'boo' => 'baz'
])->is(function($val) {
if($val === 'bar') {
return true;
}
});
var_dump($filter()); // ['foo' => 'bar']
Specifying a key name before the callback will then only apply the callback to items that match that key and exclude processing anything else. Non-matching keys will be retained by default.
$filter = filtratr\with([
'foo' => 'bar',
'bar' => 'baz'
])->is('foo', function($val) {
if($val === 'bar') {
return true;
}
});
var_dump($filter()); // ['foo' => 'bar', 'bar' => 'baz']
- equals(comparison)
- identical(comparison)
- greaterthan(comparison)
- greaterthanorequals(comparison)
- lessthan(comparison)
- lessthanorequals(comparison)
- validate(filter, options)
- serial
Map performs a transformation on selected keys/properties using a callback function.
Much like filter, map may receive a callback, optional key pattern, and callback arguments array. Unlike filter, map is not inclusive and as such map can only effectively result with a transformed value or the original value.
$filter = filtratr\with([
'foo' => ' bar ',
'fiz' => ' buz '
])->map(function($val) {
return trim($val);
});
var_dump($filter()); // ['foo' => 'bar', 'fiz' => 'buz']
Callbacks of any type (string, Closures, arrays) may be used. The following example is functionally identical to the previous
\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 ']
Mapping may be chained easily using the |
pipe operation. Method chaining is alternatively an option as well.
$filter = filtratr\with([
'foo' => ' bar',
'fiz' => 'buz '
])
->map('trim | strtoupper');
var_dump($filter()); // ['foo' => 'BAR', 'fiz' => 'BUZ']
Same method using chaining...
$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)
Like array_reduce
, the reduce statement will apply a callback to many items and produce a single result.
$filter = filtratr\with([
1, 2, 3, 4
])->reduce(function($a,$b) {
return $a * $b;
});
var_dump($filter()[0]); // 24
filtratr will technically work on objects however filtratr currently only tests on public properties. Objects are passed by reference and the query will assume the object is mutable.
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"
The extension class...
namespace MyQueryExtension;
class MyExtension extends filtratr\Query\AbstractStatement {
/* do stuff here */
}
Attaching per-filter extensions...
$filter = new filtratr\with([
'foo' => 'bar'
])
->extend('MyQueryExtension')
->myextension();
var_dump($filter());
Attaching globally...
filtratr\extend('MyQueryExtension');
$filter = new filtratr\with([
'foo' => 'bar'
])
->myextension();
var_dump($filter());