rehfeld/comparator

帮助您为 php 的 usort 函数编写简洁的数组排序回调

dev-master 2015-01-18 22:13 UTC

This package is not auto-updated.

Last update: 2024-09-24 16:40:27 UTC


README

##是什么

此类提供了一些帮助自定义排序的功能,使代码更加简洁。通常情况下,你可能会在所有地方使用 usort(),而你编写的所有回调函数通常具有以下两个功能:

  1. 一些提取排序值的代码
  2. 一些实际对排序值进行比较的代码,以返回 -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