danbettles / gestalt
提供实现涉及集合的基本模式的类。关键组件是一个实现简化过滤链模式的类,`SimpleFilterChain`,以及一个简单的数组类,`ArrayObject`。
v4.0.0
2022-04-27 09:06 UTC
Requires
- php: ^7.4|^8.0
Requires (Dev)
- danbettles/codesniffer-standard: ^v2.0.0
- phpunit/phpunit: ^8.2
- squizlabs/php_codesniffer: ^3.5.5
README
提供实现涉及集合的基本模式的类。关键组件是一个实现简化过滤链模式的类,`SimpleFilterChain`,以及一个简单的数组类,`ArrayObject`。
SimpleFilterChain
一个简单的单向过滤链。
->execute(mixed &$request, [mixed $valueToBreak = false])
依次调用每个过滤器;指定的 'request' 将传递给每个过滤器。
如果过滤器返回了 $valueToBreak
的值,则迭代将停止。如果强制停止迭代,则该方法将返回 $valueToBreak
的值。然而,如果允许迭代继续到完成,则该方法将返回 null
。
use DanBettles\Gestalt\SimpleFilterChain; $chain = (new SimpleFilterChain([ function (&$request) { $request[] = 1; }, function (&$request) { $request[] = 2; return false; }, function (&$request) { $request[] = 3; }, ])); $request = []; $returnValue = $chain->execute($request); \assert($request === [1, 2]); \assert($returnValue === false);
ArrayObject
一个简单的数组类。实例是可变的(即方法会改变对象的状态)。
->sortByKey([array $order = array()])
如果没有传递任何参数,其行为与 ksort() 相同。
use DanBettles\Gestalt\ArrayObject; $result = (new ArrayObject([ 'foo' => 'bar', 'baz' => 'qux', 'quux' => 'quuz', 'corge' => 'grault', ])) ->sortByKey() ->getElements() ; \assert($result === [ 'baz' => 'qux', 'corge' => 'grault', 'foo' => 'bar', 'quux' => 'quuz', ]);
否则,元素可以按照 $order
中指定的顺序排列;这适用于具有数字或非数字键的数组。
use DanBettles\Gestalt\ArrayObject; $elements = [ 'foo' => 'bar', 'baz' => 'qux', 'quux' => 'quuz', 'corge' => 'grault', ]; $order = [ 'corge', 'foo', 'quux', ]; $result = (new ArrayObject($elements)) ->sortByKey($order) ->getElements() ; \assert($result === [ 'corge' => 'grault', 'foo' => 'bar', 'quux' => 'quuz', 'baz' => 'qux', ]);
->each(\Closure $callback)
对每个元素执行回调。回调按顺序传递当前元素的键和值。
use DanBettles\Gestalt\ArrayObject; $elements = [ 'foo' => 'bar', 'baz' => 'qux', 'quux' => 'quuz', ]; $output = []; $arrayObject = (new ArrayObject($elements))->each(function ($key, $value) use (&$output) { $output[$key] = $value; }); \assert($output === $elements);
each()
如果回调返回精确的 false
,则停止迭代。
use DanBettles\Gestalt\ArrayObject; $output = []; (new ArrayObject([ 'foo' => 'bar', 'baz' => 'qux', 'quux' => 'quuz', ]))->each(function ($key, $value) use (&$output) { $output[$key] = $value; return false; }); \assert($output === [ 'foo' => 'bar', ]);
->reindexByColumn(string $columnKey)
当处理相同类型的记录集合(数组/对象)时很有用。例如,可以用它来根据特定列的值重新索引从数据库中选择的记录数组。
use DanBettles\Gestalt\ArrayObject; $output = (new ArrayObject([ [ 'id' => 876, 'name' => 'Foo', ], [ 'id' => 12, 'name' => 'Bar', ], [ 'id' => 1093, 'name' => 'Baz', ], ])) ->reindexByColumn('id') ->getElements() ; \assert([ 876 => [ 'id' => 876, 'name' => 'Foo', ], 12 => [ 'id' => 12, 'name' => 'Bar', ], 1093 => [ 'id' => 1093, 'name' => 'Baz', ], ] === $output);