danbettles/gestalt

提供实现涉及集合的基本模式的类。关键组件是一个实现简化过滤链模式的类,`SimpleFilterChain`,以及一个简单的数组类,`ArrayObject`。

v4.0.0 2022-04-27 09:06 UTC

This package is auto-updated.

Last update: 2024-09-29 06:20:27 UTC


README

Stand With Ukraine

Scrutinizer Code Quality Code Coverage Build Status

提供实现涉及集合的基本模式的类。关键组件是一个实现简化过滤链模式的类,`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);