bzrk / php-stream
一个简化PHP中集合处理(过滤、映射等)的库
1.01
2024-04-05 12:12 UTC
Requires
- php: >= 8.2
Requires (Dev)
- mikey179/vfsstream: >=1.6
- phpstan/phpstan: >=1.10
- phpunit/phpunit: >=11.0
- squizlabs/php_codesniffer: 3.9
README
一个处理集合的库,类似于Java中的处理方式
Stream 类
- public count(): int
- public map(Closure $call): Stream
- public flatMap(Closure $call): Stream
- public filter(Closure $call): Stream
- public notNull(): Stream
- public notEmpty(): Stream
- public each(Closure $call): void
- public toList(bool $keepKeys = false): array
- public toMap(Closure $key, Closure $value): array
- public first(): mixed
- public limit(int $size): Stream
- public order(Comparator $comparator): Stream
- public run(): Stream
- public skip(int $count): Stream
- public implode(string $separator = ','): string
- public join(string $separator = ','): string --> implode的别名
- public batch(int $count): Stream
- public associateBy(Closure $call): array
- public collect(string $class): Collection
- public toGenerator(Closure $call = null, $default = null): Generator
- public callBack(Closure $call): Stream
Streams 类
- public static of(array|Iterator|File|CsvFile $data): Stream
- public static range(int $start, int $inclusiveEnd): Stream
- public static split(string $pattern, string $source): Stream
示例
$data = [ (object)["name" => "hallo", "data" => ["a", "b"]], (object)["name" => "hallo", "data" => ["a", "b", "H", "g"]], (object)["name" => "hallo", "data" => ["a", "b", "d"]], ]; $result = Streams::of($data) ->map(fn(object $obj) => (object)["name" => $obj->name, "cnt" => count($obj->data)]) ->filter(fn(object $obj) => $obj->cnt !== 4) ->order(new Comparator(fn(object $a, object $b) => $a->cnt - $b->cnt)) ->map(fn(object $obj) => "$obj->name - $obj->cnt") ->toList(); //Result is ['hallo - 2', 'hallo - 3']
从类型化集合创建Stream
class User { ... } class UserCollection extends Collection { public function __construct(User ...$data) { parent::__construct($data); } public function add(User $value): void { parent::addEntry($value); } } (new UserCollection(new User("name")))->stream()->map(....)
更多示例在测试套件中。
运行测试
composer verify
或者
docker-compose up