loophp/collection

一个内存友好、易于使用、懒加载且模块化的集合类。

7.6.1 2024-08-27 16:18 UTC

This package is auto-updated.

Last update: 2024-09-07 21:31:36 UTC


README

Try! Latest Stable Version GitHub stars Total Downloads GitHub Workflow Status Scrutinizer code quality Type Coverage Code Coverage Mutation testing badge License Donate!

PHP 集合

描述

Collection 是一个针对 PHP 7.4 及以上版本的函数式实用程序库,包括 PHP 8.0。

它与基于常规 PHP 数组的其他集合库类似,但在底层具有懒加载机制,力求尽可能少地工作,同时尽可能灵活。

例如,像 array_map()array_filter()array_reduce() 这样的函数很棒,但它们会创建新的数组,并且所有操作都在进入下一步之前完成。懒加载集合利用 PHP 的生成器、迭代器和 yield 语句,允许您处理非常大的数据集,同时尽可能保持内存使用量最低。

例如,假设您的应用程序需要处理一个多吉字节大小的日志文件,同时利用这个库的方法来解析文件。而不是一次性读取并存储整个文件到内存中,这个库可以用来在给定时间内只保留文件的一小部分在内存中。

除此之外,这个库

  • 是不可变的,
  • 可扩展的,
  • 广泛使用 S.O.L.I.D. 原则
  • 利用 PHP 生成器迭代器 的功能,
  • 经过广泛测试,
  • 使用严格类型,
  • 框架无关。

除了少数方法外,大多数方法都是 纯函数,并返回一个新的 Collection 对象

此外,与常规 PHP 数组中键必须是 intstring 类型不同,这个集合库允许您为键使用任何类型的类型: integerstringobjectarray、... 任何东西!这个库可以作为一个有效的替代品来替换 \SplObjectStorage,但功能更强大。这种方式的工作方式开辟了新的视角和另一种处理数据的方法,以更函数式的方式。

最后但同样重要的是,集合键在大多数操作中都被保留;虽然一开始可能会有些困惑,但请仔细阅读 这个示例,以了解完整的解释和好处。

这个库受到了以下灵感的启发

功能

  • 解耦:每个集合方法都是指向一个独立的标准类的快捷方式,每个操作都有自己的职责。通常,需要的参数是标准的PHP变量,如 intstringcallableiterator。这允许用户根据意愿单独使用这些操作,构建自定义的功能。目前,这个库中有超过 100 个操作。这个库是你可以用所有这些小积木做什么的例子,但用户也可以单独使用一个操作。

  • 先函数后数据:在下面的示例中,创建了多个操作。要操作的数据通常是在最后提供。

    <?php
    
    $input = ['foo', 'bar', 'baz'];
    
    // Using the Collection library
    $collection = Collection::fromIterable($input)
        ->filter(static fn(string $userId): bool => 'foo' !== $userId)
        ->reverse();
    
    foreach ($collection as $item); // ['baz','bar']
    
    // Using single operations.
    $pipe = Pipe::of()(
      Reverse::of(),
      Filter::of()($filterCallback)
    );
    
    foreach ($pipe($input) as $item); // ['baz','bar']

    更多关于这个内容的信息可以在 Brian Lonsdorf 的会议 中找到,即使这是关于 JavaScript 的,这些概念在其它编程语言中也很常见。

    简而言之,组合和函数优先的组合使得开发者可以用很少的代码(通常是“无参数”的方式)来组合函数,最终传递相关的用户数据。

  • 操作是无状态的,默认使用柯里化:这种柯里化使得组合函数来创建新函数变得容易。因为API是 先函数后数据,你可以继续组合,直到构建出你需要的函数,然后再加入数据。请参阅 这篇 Hugh Jackson 文章,了解这种风格的优点。

    在下面的示例中,知名的 flatMap 可以与其他操作组合如下

    <?php
    
    $input = ['foo,bar', 'baz,john'];
    
    $flatMap = static fn (callable $callback) =>
      Pipe::of()(
          Map::of()(static fn(string $name): array => explode(',', $name)),
          Flatten::of()(1)
      );
    
    foreach ($flatMap($input) as $item); // ['foo', 'bar', 'baz', 'john']

安装

composer require loophp/collection

用法

请查看 用法页面,了解简单和更高级的使用案例。

依赖

文档

除了良好的代码文档外,该包还包括完整的文档,每次提交都会自动编译和发布在 https://loophp-collection.rtfd.io

集合原则 将帮助你理解这个包的核心元素,以便你最大限度地利用它的使用。

API 将让你对现有的方法和你可以用它们做什么有一个很好的了解。

我们正在尽最大努力使文档保持最新;如果你发现了一些奇怪的地方,请在 问题队列 中告诉我们。

代码质量、测试、基准测试

每当引入库中的更改时,Github 都会运行测试。

该库使用 PHPUnit 编写测试。您可以随时在 tests/unit/ 目录中查看它们。运行 composer phpunit 以触发测试。

在每次提交之前,都会使用 GrumPHP 执行一些检查;运行 composer grumphp 以手动检查。

测试质量通过Infection(一个PHP变异测试框架)进行测试 - 运行composer infection来尝试。

静态分析器也在控制代码。已启用PHPStanPSalm的最大级别。

贡献

欢迎通过发送pull请求进行贡献。我们通常是一个非常响应的团队,我们会从开始到结束帮助您处理您的pull请求,更多关于这一点的信息请参阅文档

由于某些原因,如果您无法对代码进行贡献但愿意帮助,赞助是一个好、合理且安全的方式来对我们在这套软件包上投入的时间表示感谢。

Github上赞助我,以及任何贡献者

在互联网上

变更日志

查看CHANGELOG.md,以查看基于git提交的变更日志。

有关更详细的变更日志,请参阅发布变更日志