rehfeld /comparator
帮助您为 php 的 usort 函数编写简洁的数组排序回调
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.3.*
This package is not auto-updated.
Last update: 2024-09-24 16:40:27 UTC
README
##是什么
此类提供了一些帮助自定义排序的功能,使代码更加简洁。通常情况下,你可能会在所有地方使用 usort()
,而你编写的所有回调函数通常具有以下两个功能:
- 一些提取排序值的代码
- 一些实际对排序值进行比较的代码,以返回 -1、0 或 1,以满足
usort()
。
此类试图减轻你的比较负担——你只需要提供提取值的代码。在基本情况下,它也可以在很大程度上减轻你的负担。
而不是编写同时提取值并比较的代码
usort($arrayOfUser, function(User $a, User $b) {
// Code that extracts the sorting value
$dateA = $a->getBirthdayAsDatetime();
$dateB = $b->getBirthdayAsDatetime();
// Code that compares the sorting value
if ($dateA == $dateB) {
return 0;
}
return $dateA < $dateB ? -1 : 1;
});
只需提供一个生成排序值的函数
usort($arrayOfUser, Comparator::sortAscByValueExtractor(function(User $user) {
return $user->getBirthdayAsDatetime();
}));
在这种情况下,由于排序值可以通过一个方法调用提取,因此你也可以这样做
usort($arrayOfUser, Comparator::sortAscByMethod('getBirthdayAsDatetime'));
提供了方便的排序方法,包括根据数组键、公共对象属性或公共方法进行排序。但最强大的是 valueExtractor 方法,因为它们允许你使用自定义逻辑。
另一个包含的方法允许你使用与 SQL order by 子句相同的语义进行排序。以下将按照与 SQL ... order by lastName asc, age desc, gender asc
相同的方式排序
$arrayOfRows = [
['lastName' => 'smith', 'age' > 25, 'gender' => 'male'],
['lastName' => 'hax', 'age' > 33, 'gender' => 'male'],
];
usort($arrayOfRows, Comparator::tieBreaker(
Comparator::sortAscByArrayKey('lastName'),
Comparator::sortDescByArrayKey('age'),
Comparator::sortAscByArrayKey('gender'),
));
###注意 此类默认使用松散比较运算符 ==
和 <
,但并非所有值都可以通过它们正确比较。特别是,当比较不同类型时,松散比较运算符可能会表现得古怪。如果你需要通过使用,例如,strcmp
来强制字符串比较语义,可以直接使用 ComparatorBuilder
类并提供自定义的比较函数。但是,你可能考虑在这种情况下根本不使用此类——你并没有真正从从头编写自己的 usort()
回调中获得太多。
##安装 使用 composer 获取。
##测试 包含了 100% 代码覆盖率的测试套件。您可以通过将当前目录更改为此项目的目录并运行命令来运行它。
./vendor/bin/phpunit