claytron5000 / better-arrays
用于函数式数组处理的数组包装器。
Requires
- php: ^7.2
This package is auto-updated.
Last update: 2024-09-13 22:28:28 UTC
README
这是一个出于愤怒的项目。它起源于我负责修复一个Web应用程序中的报告屏幕的时候。前一位开发者进行了一些复杂的重复数据库查询。随着应用程序的增长,这个页面变得越来越慢,直到它开始超时。我知道我可以通过一个查询获取我需要的数据,但为了使它适合预期的图表和图形,我需要进行大量的数据减少和映射。
PHP有一套令人惊叹的数组方法;如果你还没有查看过,可以看看:https://php.ac.cn/manual/en/ref.array.php。然而,作为一个来自ES6 JavaScript的人,这看起来有点令人不知所措。在ES6中,大多数数组处理都可以用“大三元”来完成:map、filter、reduce。不仅如此,你还可以链式调用这些方法,制作出美丽的链式数组解析。
let arrayOfObjects = array
.filter(x => x.children.length > 0)
.reduce((accumulator, x) => {
let children = x.children.map(child => ({parent: x.name, ...child}))
return accumulator.concat(children)
}, [])
.map(x => new CoolObject(x))
在PHP中,你可能会找到一个满足你确切需求的方法,列表中有81个方法。然而,方法的签名不同,有些是就地修改数组,最重要的是,它们不能链式调用。
所以,在PHP中,你可能不得不这样做
$filtered = array_filter($array, function($x) { return count($x.children) > 0});
$reduced = array_reduce($filtered, function($x) {
$children = array_map(function($child) { return ["parent" => $child.name, etc, etc ]}, $x);
}, []);
$mapped = array_map(function($x) { return new CoolObject($x); }, $reduced);
你可以看到我在写了一半的时候失去了兴趣。同时,注意array_map的方法签名是如何从array_reduce和array_filter中翻转的。
我必须承认,PHP的数组方法是强大的,但我断言它们过于强大,因此难以阅读、难以编写,并且通常不友好。
我在这里省略了PHP的一个主要功能,键值数组。一些方法包含在此处,但我们因为只有一个返回策略而错过了一些功能。
在《Better Arrays》中,我的目标是使数组处理可链式、易于阅读和编写。对我而言最重要的是map、filter和reduce,但由于有很多有趣的方法,所以我在合适的地方包含了它们。由于需要链式调用,我排除了任何修改数组的方法。
今天试试,拥有一个BetterArray。
$arrayOfObjects = new BetterArray($array)
.filter(function($x) { return count($x.children) > 0;})
.reduce(function($acc, $x) {
return array_merge($acc, $x.children);
}, [])
.map(function($x) { return new CoolObject($x);})
.returnArray();
用法
如果不明显,这是一个非常个人的项目,我还没有确定首选的实现方法,所以我包括了所有的方法。
// Object instantiation
$arr = new BetterArray($array);
// Static method
$arr = BetterArray::funcify($array);
// Function wrapper
$arr = betterArray($array);
包含你的数组的BetterArray在你使用任何一个返回方法之前都会返回自身。主要的一个是returnArray,它返回数组在其最后状态下的数组。