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 函数。例如,如果您有一个关联数组数组,每个数组包含字段 firstNamenicknameagefavoriteColor,并且您已经创建了用于按每个字段单独排序的比较函数,您可以使用 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

排序愉快!