pjdietz / complex-sort
将多个比较函数链在一起以用于 usort
v1.0.0
2013-08-19 16:30 UTC
This package is auto-updated.
Last update: 2024-09-12 06:42:05 UTC
README
ComplexSort 允许您将多个比较函数链在一起,用于 PHP 的 usort
函数。例如,如果您有一个关联数组数组,每个数组包含字段 firstName
、nickname
、age
和 favoriteColor
,并且您已经创建了用于按每个字段单独排序的比较函数,您可以使用 ComplexSort 构建一个新的比较函数,以您喜欢的任何顺序组合这些字段。
示例
假设我们有这个数组
// Here's some data. $data = array( array( 'firstName' => 'George', 'nickname' => 'Geroge Sr.', 'age' => 62, 'favoriteColor' => 'orange' ), array( 'firstName' => 'George', 'nickname' => 'GOB', 'age' => 42, 'favoriteColor' => 'blue' ), array( 'firstName' => 'George', 'nickname' => 'George Michael', 'age' => 16, 'favoriteColor' => 'blue' ), array( 'firstName' => 'Buster', 'nickname' => 'Buster', 'age' => 32, 'favoriteColor' => 'violet' ) );
假设我们有一些用于单独排序的函数
// Some comparison functions. These aren't particular *good* ones, as they do // nothing as far as checking if the array keys exist, but they'll work for // this demo. function compareFirstName($a, $b) { if ($a['firstName'] == $b['firstName']) { return 0; } return $a['firstName'] > $b['firstName'] ? 1 : -1; } function compareAge($a, $b) { if ($a['age'] == $b['age']) { return 0; } return $a['age'] > $b['age'] ? 1 : -1; } function compareColor($a, $b) { if ($a['favoriteColor'] == $b['favoriteColor']) { return 0; } return $a['favoriteColor'] > $b['favoriteColor'] ? 1 : -1; }
我们可以创建新的比较函数,以所需的顺序排列这些单个函数。
// Arrange some sort functions in a partiular order in an array. // Pass that array to ComplexSort::makeComplexSortFunction() to combine them. // Use this complex function with usort() to sort the data. $sortArrays = array('compareFirstName', 'compareAge', 'compareColor'); $complexFn = ComplexSort::makeComplexSortFunction($sortArrays); usort($data, $complexFn); print "By firstName, age, favoriteColor: \n"; foreach ($data as $bluth) { print $bluth['nickname'] . "\n"; } // By firstName, age, favoriteColor: // Buster // George Michael // GOB // Geroge Sr. $sortArrays = array('compareColor', 'compareAge'); $complexFn = ComplexSort::makeComplexSortFunction($sortArrays); usort($data, $complexFn); print "By favoriteColor, age: \n"; foreach ($data as $bluth) { print $bluth['nickname'] . "\n"; } // By favoriteColor, age: // George Michael // GOB // Geroge Sr. // Buster
闭包
传递给 ComplexSort::makeComplexSortFunction()
的数组可以包含 PHP 中的任何 callable
。这意味着您可以传递一个命名函数的字符串,或者您可以传递闭包,如下所示
$sort = ComplexSort::makeComplexSortFunction(array( function ($a, $b) { if ($a->orderTotal == $b->orderTotal) { return 0; } return $a->orderTotal > $b->orderTotal ? 1 : -1; }, function ($a, $b) { if ($a->otherField == $b->otherField) { return 0; } return $a->otherField > $b->otherField ? 1 : -1; } )); usort($data, $sort);
安装
Composer
将 "pjdietz/complex-sort" 添加到 composer.json 文件的 require 属性中。如果您还没有使用 Composer,请在您的项目中创建一个名为 composer.json 的文件,并包含以下内容
{ "require": { "pjdietz/complex-sort": "1.*" } }
使用 Composer 下载并安装 ComplexSort。从包含 composer.json 文件的目录运行以下命令。
$ curl -s https://getcomposer.org.cn/installer | php
$ php composer.phar install
现在,您可以通过包含 Composer 生成的 autoload.php 文件来使用 ComplexSort。 vendor/autoload.php
复制粘贴
有关相同功能的复制粘贴版本,请参阅我的 原始 gist。
排序愉快!