yoshi2889/collections

一个简单的集合类,允许存储特定数据。

v0.2 2021-11-03 10:15 UTC

README

Build Status Scrutinizer Code Quality Scrutinizer Code Coverage Latest Stable Version Latest Unstable Version Total Downloads

一个基于PHP的ArrayObject的简单集合类,允许存储特定数据。

安装

您可以通过composer安装此类

composer require yoshi2889/collections

用法

要使用集合,创建一个新的实例

$validationClosure = function ($value)
{
    return is_string($value);
};

$initialItems = ['This is a test value!', 'This is another test value!'];

$collection = new \Yoshi2889\Collections\Collection($validationClosure, $initialItems);

请注意,传递给Collection构造函数的第一个参数的闭包必须返回一个布尔值。此函数用于验证任何添加的数据类型。返回值为true表示给定的值可以添加到集合中。

第二个参数可以包含任何应在集合中的初始值。这些项也将被验证。

验证

使用Closure实例或回调来验证数据。给定的闭包必须支持正好1个无类型(!)参数并返回一个布尔值。闭包返回false的值将被拒绝,并抛出\InvalidArgumentException异常。

请注意,只有被验证,而键不被验证。

可以使用->validateType($value)->validateArray(array $array)方法手动执行验证,这些方法分别检查单个值和值数组。

->validateType($value)如果值通过验证,则返回布尔值true,如果不通过验证,则返回false

->validateArray(array $array)如果所有值通过验证,则返回布尔值true,如果有一个或多个值没有通过验证,则返回false

操作

可以像通用数组一样处理Collection实例。这意味着您可以像以下示例那样操作它

$validationClosure = function ($value)
{
    return is_string($value);
};

$collection = new \Yoshi2889\Collections\Collection($validationClosure);

$collection['foo'] = 'bar';

请注意,通过这种方式输入的数据仍然会进行验证,并且可能仍然会抛出\InvalidArgumentException异常。

此外,要从集合中删除数据,您可以使用->offsetUnset($index)->removeAll($value)方法。

->offsetUnset($index)将删除位于键$index处的值,这类似于使用unset($collection['key'])

->removeAll($value)将删除集合中等于$value的所有值。由于值可能在同一个集合中存在多次,因此不可能通过值可靠地仅从集合中删除一个值;考虑通过键删除。如果您希望在创建一个新实例时保留原始值而不包含某些值,请参阅下面的过滤部分。

过滤

可以使用->filter(\Closure $condition)方法过滤集合。给定的闭包必须返回一个布尔值。

条件闭包为集合中的每个元素调用。任何闭包返回true的元素将被保留并放入一个新的Collection实例中,该实例将被返回。例如,要过滤掉所有不是foo的元素

$validationClosure = function ($value)
{
    return is_string($value);
};

$initialItems = ['foo', 'bar', 'baz', 'foo', 'bar', 'baz'];

$collection = new \Yoshi2889\Collections\Collection($validationClosure, $initialItems);

$filterClosure = function ($value)
{
    return $value != 'foo';
};

// Will contain: ['bar', 'baz', 'bar', 'baz']
$newCollection = $collection->filter($filterClosure);

事件

如果数据被添加到或从集合中删除,则集合将发出changed事件。没有传递任何参数。此功能是从igorwÉvénement借用来的。

您可以使用->on($event, callable $listener)方法订阅事件,如下所示

$collection->on('changed', function ()
{
    echo 'The collection changed!';
});

验证闭包

您可以在单独的验证闭包项目中找到许多可以由集合使用的闭包和工具。

许可证

此代码根据MIT许可证发布。请参阅LICENSE文件以阅读许可证内容。