loophp / collection
一个内存友好、易于使用、懒加载且模块化的集合类。
Requires
- php: >= 8.1
- loophp/iterators: ^3.2.0
Requires (Dev)
- ext-pcov: *
- amphp/parallel-functions: ^1
- doctrine/collections: ^2
- drupol/php-conventions: ^5
- infection/infection: ^0.27 || ^0.28 || ^0.29
- loophp/phpunit-iterable-assertions: ^1.0
- phpstan/phpstan-strict-rules: ^1.0
- phpunit/php-code-coverage: ^10
- phpunit/phpunit: ^10
- psr/cache: ^2.0 || 3.0
- symfony/cache: ^6
- vimeo/psalm: ^5
- dev-master
- 7.6.1
- 7.6.0
- 7.5.2
- 7.5.1
- 7.5.0
- 7.4.0
- 7.3.0
- 7.2.1
- 7.2.0
- 7.1.2
- 7.1.1
- 7.1.0
- 7.0.0
- 6.0.3
- 6.0.2
- 6.0.1
- 6.0.0
- 5.1.0
- 5.0.0
- 4.1.0
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.4.3
- 3.4.2
- 3.4.1
- 3.4.0
- 3.3.5
- 3.3.4
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.2.0
- 3.1.1
- 3.1.0
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.7.x-dev
- 2.7.4
- 2.7.3
- 2.7.2
- 2.7.1
- 2.7.0
- 2.6.3
- 2.6.2
- 2.6.1
- 2.6.0
- 2.5.5
- 2.5.4
- 2.5.3
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.0
- 2.3.5
- 2.3.4
- 2.3.3
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.0
- 2.1.0
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.1.1
- 1.1.0
- 1.0.11
- 1.0.10
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.0.17
- 0.0.13
- 0.0.12
- 0.0.10
- 0.0.9
- 0.0.8
- 0.0.7
- 0.0.6
- 0.0.5
- 0.0.4
- 0.0.3
- 0.0.2
- 0.0.1
- dev-refactor-exploring-new-ideas
- dev-sort-improvements
- dev-fix/cache-operation
- dev-no-name-yet
- dev-fix-distinct-bug-infinite-loop
- dev-feat/add-convolve-operation
- dev-feat/add-operate-operation
- dev-add-abstract-class
- dev-documentation-refactoring
- dev-refactor/update-pipe
- dev-ci/tests-on-php-8.1
- dev-feature/add-find-helper
- dev-Radiergummi-feature/add-find-helper
- dev-refactor/remove-static-of-method
- dev-refactor/remove-AbstractOperation
- dev-fix/update-associate-and-flip-operation
- dev-experiment/update-pipe-operation
- dev-refactor/update-Operation-interface-remove-of-method
- dev-sa/fix-map-operation
- dev-feature/add-iterator-factory
- dev-refactor/switch-to-phpunit
- dev-feature/use-loophp-fpt
- dev-feature/higher-order-collection-proxy
- dev-feature/partition-generator-issue
- dev-add-nix-shell-file
- dev-update-annotations-remove-prefix
- dev-aszenz/master
- dev-ci-php-8
This package is auto-updated.
Last update: 2024-09-07 21:31:36 UTC
README
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 数组中键必须是 int
或 string
类型不同,这个集合库允许您为键使用任何类型的类型: integer
、string
、object
、array
、... 任何东西!这个库可以作为一个有效的替代品来替换 \SplObjectStorage,但功能更强大。这种方式的工作方式开辟了新的视角和另一种处理数据的方法,以更函数式的方式。
最后但同样重要的是,集合键在大多数操作中都被保留;虽然一开始可能会有些困惑,但请仔细阅读 这个示例,以了解完整的解释和好处。
这个库受到了以下灵感的启发
- Laravel 支持包
- DusanKasan/Knapsack
- mtdowling/transducers
- Ruby Array
- Collect.js
- nikic/iter
- Haskell
- Ramda
- Lazy.js
功能
-
解耦:每个集合方法都是指向一个独立的标准类的快捷方式,每个操作都有自己的职责。通常,需要的参数是标准的PHP变量,如
int
、string
、callable
或iterator
。这允许用户根据意愿单独使用这些操作,构建自定义的功能。目前,这个库中有超过 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
用法
请查看 用法页面,了解简单和更高级的使用案例。
依赖
- loophp/iterators:一个提供PHP迭代器的包。
文档
除了良好的代码文档外,该包还包括完整的文档,每次提交都会自动编译和发布在 https://loophp-collection.rtfd.io。
集合原则 将帮助你理解这个包的核心元素,以便你最大限度地利用它的使用。
API 将让你对现有的方法和你可以用它们做什么有一个很好的了解。
我们正在尽最大努力使文档保持最新;如果你发现了一些奇怪的地方,请在 问题队列 中告诉我们。
代码质量、测试、基准测试
每当引入库中的更改时,Github 都会运行测试。
该库使用 PHPUnit 编写测试。您可以随时在 tests/unit/
目录中查看它们。运行 composer phpunit
以触发测试。
在每次提交之前,都会使用 GrumPHP 执行一些检查;运行 composer grumphp
以手动检查。
测试质量通过Infection(一个PHP变异测试框架)进行测试 - 运行composer infection
来尝试。
静态分析器也在控制代码。已启用PHPStan和PSalm的最大级别。
贡献
欢迎通过发送pull请求进行贡献。我们通常是一个非常响应的团队,我们会从开始到结束帮助您处理您的pull请求,更多关于这一点的信息请参阅文档。
由于某些原因,如果您无法对代码进行贡献但愿意帮助,赞助是一个好、合理且安全的方式来对我们在这套软件包上投入的时间表示感谢。
在互联网上
变更日志
查看CHANGELOG.md,以查看基于git提交的变更日志。
有关更详细的变更日志,请参阅发布变更日志。