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

分享 CismonX ⋅ 于 1个月前 ⋅ 最后回复由 lmaster 1天前 ⋅ 1292 阅读

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

本帖已被设为精华帖!
本帖由系统于 1个月前 自动加精
回复数量: 10
  • Hanson Keep Learning, Keep Running
    1个月前
  • CismonX Web backend developer. Electrical Engineer.
    1个月前

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

  • Lestat
    1个月前

    支持一下

  • SebastianKenendy
    1个月前

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

  • bestcyt 1
    1个月前

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

  • echofree313 1
    2周前

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

  • BestModer PHPer学习着...
    2周前

    支持

  • reatang
    1周前

    666

  • JackLiang
    1周前

    收藏 :+1:

  • lmaster phper
    4天前

    @CismonX 有中文文档没啊?

暂无评论~~

  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!