例如,我们有一个数组,包含了一系列员工的姓名、性别、年龄等信息:
$employees = [
['name' => 'Alice', 'gender' => 'female', 'age' => 35],
['name' => 'Bob', 'gender' => 'male', 'age' => 29],
['name' => 'David', 'gender' => 'male', 'age' => 40],
['name' => 'Benjamin', 'gender' => 'male', 'age' => 32]
];
我们需要从中获取所有男性员工的姓名,按照他们的年龄倒序排列。用原生 PHP 函数我们可以这样实现:
$arr = array_filter($employees, function ($value) {
return $value['gender'] == 'male';
});
usort($arr, function ($v1, $v2) {
return $v2['age'] - $v1['age'];
});
$names = array_map(function ($value) {
return $value['name'];
}, $arr);
// $names == ['David', 'Benjamin', 'Bob']
如果能像下面这样实现,代码的可读性会得到明显提升:
$names = Collection::init($employees)
->filter(function ($value) {
return $value['gender'] == 'male';
})
->sortedByDescending(function ($value) {
return $value['age'];
})
->map(function ($value) {
return $value['name'];
})
->toArray();
ext-collections 扩展库提供了这样的能力。它包含大量的用于操作 PHP 数组的方法,当我们需要操作的数据非常复杂时,使用它来代替 PHP 原生的数组函数,有助于提高开发效率,写出更优雅、更易维护的代码。
同时,ext-collections 使用 C 语言实现,性能上不弱于 PHP 提供的原生函数,一定程度上优于 Laravel Collections 等 PHP 实现的同类的库(性能优势有限,因为绝大多数的开销在回调上)。相比一些 C 实现的同类的库(如 viest/php-ext-collection)也提供了更丰富的功能。
这个项目是我在 2018 年初学 Kotlin 的时候,第一次见到 kotlin.collections 中的写法(那会儿还没学 Java,不知道 Stream API ),觉得很 cool 。正巧也在学 PHP,发现 PHP 没有原生支持这样的写法,就头脑一热造了个轮子,零零散散大概用了半年多时间完成。试着投稿 PECL 被拒,原因是 PHP 已经有了 DS 扩展,建议在它的基础上扩充,而不是重新搞一个类出来。
后来忙着实习和毕设,就没怎么打理这个项目。去年下旬 PHP 7.4 发布后,适配了一下 PHP 7.4 。最近几天又接入了一下 Codecov 。之后可能不会主动为这个项目添加更多的 feature 了,因为我还在搞好几个其他的开源项目。发到这里主要是希望有需要的朋友能够看到这个项目,尝试使用它并反馈 bug 。有兴趣的朋友还可以为该项目增添更多的 feature,从而让它活跃得更久。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.