[扩展推荐] ext-collections: 优雅、快速地操作 PHP 数组【Now going BETA】
56

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

经过5个多月来断断续续的开发,目前其主要功能已实现并经过测试,发布了第一个beta版本。欢迎大家测试并反馈问题。

Living on the bleeding edge

本帖已被设为精华帖!
本帖由系统于 5个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 11
Hanson
6个月前
CismonX

@Hanson 嗯,我刚才看了下那个扩展,实现的功能还是少了些。相比,ext-collections有将近100个方法,其命名和功能严格依照Kotlin.Collections中的实现。其实这类扩展实现难度很低(写起来没有成就感),也有一些人写过(有重复造轮子之嫌),但是以我目前见过的类似开源扩展来看,多半有诸如内存泄漏或者违背写时复制原则的bug,而且无一例外地功能少。所以我觉得用心开发出一个适用性强、高效且稳定的数组操作扩展还是很有必要的。

5个月前

支持一下

5个月前

收藏了,以后学习扩展的时候,看看楼主的源码,感谢分享。

5个月前

不是酱紫就好了嘛 array_multisort(array_column($employees,'age'),SORT_DESC,$employees);

5个月前

怎么收藏文章。没找到收藏文章的地方。

5个月前

支持

5个月前

666

5个月前

收藏 :+1:

5个月前
lmaster

@CismonX 有中文文档没啊?

4个月前
CismonX

第一个beta版本已经发布,在正式发布之前,还需要进行一些最后的测试工作。如果顺利的话,这两个月可以进驻PECL。

1个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!