marcegarba/funccoll

PHP 函数集合库

1.1.0 2016-04-11 04:00 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:08:27 UTC


README

Build Status Coverage Status Stable      License

这个小库受到了 Martin Fowler 的 collection pipeline 模式的启发,旨在在 PHP 中实现此模式。

文章中 Ruby 和 Clojure 的示例之美与 PHP 中 lambda(闭包)笨拙的语法形成对比;尽管如此,我的意图是使在 PHP 中创建集合管道变得容易。

安装

您可以通过 composer 包在 Packagist 中获取此 PHP 库。只需将此依赖项添加到您的 composer.json

{
    "require": {
        "marcegarba/funccoll": "@stable"
    }
}

工作原理

Collection 类实现了一个不可变的集合,由一个数组支持。

该类有两个静态工厂方法,fromArray()generate()

前者通过传递一个 PHP 数组创建一个 Collection 对象。

后者使用闭包生成集合元素。

不可变性

每次转换都会创建一个新的集合对象。

该类本身实现了 ArrayAccessCountable,因此它可以在某种程度上用作数组;但它没有实现 Iterator(通过使用 foreach 语言结构遍历集合),因为这将意味着有一个计数器,从而使类实例可变。

由于不可变性,ArrayAccess 接口的 offsetSet()offsetUnset() 的实现抛出 LogicException

显然,不可变性是与集合本身有关,而不是其元素的状态。

提取数组

toArray() 方法提取原始数组。

如果需要进行任何更改,则应在此数组上执行。当然,可以用于创建另一个 Collection 对象的更改后的数组。

示例

这里有一些简单示例,使用了两个工厂方法。

示例 1:添加奇数乘以二

使用从 1 到 10 的连续数字列表生成第一个对象;然后应用连续的转换,以获得前三个奇数的双倍总和。

use Marcegarba\FuncColl\Collection;

$sum = Collection::fromArray(range(1, 10))
    ->filter(function ($elem) { return $elem % 2 != 0; })
    ->take(3)
    ->map(function ($elem) { return $elem * 2; })
    ->reduce(function ($acc, $num) { return $acc + $num; });

echo $sum; // Outputs 18

示例 2:从 PDO 查询中提取行

本例使用PDO查询的结果生成一个关联数组列表(最多包含100个元素),然后每个数组都用于创建一个实体对象,基于该行的内容,并将生成的实体对象数组存储在一个变量中。

use Marcegarba\FuncColl\Collection;

$pdo = new PDO(...);

$stmt = $pdo->query('SELECT * from items');

$generator = function () use ($stmt) {
    return $stmt->fetch(PDO_ASSOC);
}

$items =
    Collection::generate($generator, 100)
    ->map(function ($row) { return new Item($row); });

方法总结

以下是按字母顺序排序的主要实例方法