[扩展推荐] ext-collections: 优雅、快速地操作 PHP 数组

分享 CismonX ⋅ 于 3个月前 ⋅ 最后回复由 lmaster 2个月前 ⋅ 1634 阅读

PHP提供了一系列的数组操作函数。然而,当我们需要对数组进行一系列相对复杂的操作时,它们使用起来并不是十分的优雅,而且代码的可读性也很一般。
例如,我们有一个数组,包含了一系列员工的姓名、性别、年龄等信息:

$employees = [
    ['name' => 'Alice', 'sex' => 'female', 'age' => 35],
    ['name' => 'Bob', 'sex' => 'male', 'age' => 29],
    ['name' => 'David', 'sex' => 'male', 'age' => 40],
    ['name' => 'Benjamin', 'sex' => 'male', 'age' => 32]
];

我们需要从中获取所有男性员工的姓名,按照他们的年龄倒序排列。用原生PHP函数我们可以这样实现:

$arr = array_filter($employees, function ($value) {
    return $value['sex'] == 'male';
});
usort($arr, function ($v1, $v2) {
    return $v2['age'] - $v1['age'];
});
$names = array_map(function ($value) {
    return $value['name'];
}, $arr);
// $names == ['David', 'Benjamin', 'Bob'].

如果使用ext-collections扩展,我们就可以这样优雅、快速地实现:

$names = Collection::init($employees)
    ->filter(function ($value) {
        return $value['sex'] == 'male';
    })
    ->sortedByDescending(function ($value) {
        return $value['age'];
    })
    ->map(function ($value) {
        return $value['name'];
    })
    ->toArray();

虽然这类封装有很多,但是与目前流行的各种数组操作库相比,ext-collections有以下优势:

  • 使用C实现,性能远超过使用PHP代码的实现,甚至超过了PHP提供的内置实现(该扩展专门为数据操作而设计,免去了一些不必要的检查)。
  • 功能丰富,基本上覆盖了Kotlin.Collections的绝大多数功能。

项目地址:https://github.com/CismonX/ext-collections

目前该项目正在持续开发中,部分功能已实现并经过测试。预计在今年夏天完成开发。
欢迎各位以任何形式为该扩展做出贡献,如测试bug,或是提交尚未完成的功能的实现。

本文章首发在 Laravel China 社区

Living on the bleeding edge

本帖已被设为精华帖!
本帖由系统于 3个月前 自动加精
回复数量: 10
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 250 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Composer 中文文档

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档