PHPackages                             pjdietz/complex-sort - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. pjdietz/complex-sort

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

pjdietz/complex-sort
====================

Chain multiple comare functions together for use in usort

v1.0.0(12y ago)02.1kMITPHP

Since Aug 19Pushed 12y ago1 watchersCompare

[ Source](https://github.com/pjdietz/complex-sort)[ Packagist](https://packagist.org/packages/pjdietz/complex-sort)[ Docs](https://github.com/pjdietz/complex-sort)[ RSS](/packages/pjdietz-complex-sort/feed)WikiDiscussions master Synced 2w ago

READMEChangelogDependenciesVersions (2)Used By (0)

ComplexSort
===========

[](#complexsort)

ComplexSort allows you to chain together multiple comparison functions for us in PHP's `usort` function. For example, if you have a an array of associative arrays, each with the fields `firstName`, `nickname`, `age`, and `favoriteColor`, and you've created comparison functions to sort by each of these fields individually, you can use ComplexSort to build a new comparison function that combines these in whichever order you like.

Examples
--------

[](#examples)

Say way have this array:

```
// 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'
    )
);
```

And suppose we have these functions for sorting individually:

```
// 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;
}
```

We can make new comparison functions that order these individual functions in whichever order we need.

```
// 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
```

### Closures

[](#closures)

The array passed to `ComplexSort::makeComplexSortFunction()` can include anything that is a `callable` in PHP. This means you can pass a string that names a function, or you can pass closures, like this:

```
$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);
```

Install
-------

[](#install)

### Composer

[](#composer)

Add an entry for "pjdietz/complex-sort" to your composer.json file's **require** property. If you are not already using Composer, create a file in your project called **composer.json** with the following content:

```
{
    "require": {
        "pjdietz/complex-sort": "1.*"
    }
}
```

Use Composer to download and install ComplexSort. Run these commands from the directory containing the **composer.json** file.

```
$ curl -s https://getcomposer.org/installer | php
$ php composer.phar install
```

You can now use ComplexSort by including the **autoload.php** file generated by Composer. `vendor/autoload.php`

### Copy-and-paste

[](#copy-and-paste)

For a copy-and-paste version of the same functionality, see my [original gist](https://gist.github.com/pjdietz/5292681).

Happy sorting!

###  Health Score

29

—

LowBetter than 57% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

4698d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/51c270797760b2893b6300c7efa1a4d3ef117771f901debea3954d947201e51e?d=identicon)[pjdietz](/maintainers/pjdietz)

---

Top Contributors

[![pjdietz](https://avatars.githubusercontent.com/u/1231859?v=4)](https://github.com/pjdietz "pjdietz (4 commits)")

---

Tags

arraycomparesort

### Embed Badge

![Health badge](/badges/pjdietz-complex-sort/health.svg)

```
[![Health](https://phpackages.com/badges/pjdietz-complex-sort/health.svg)](https://phpackages.com/packages/pjdietz-complex-sort)
```

###  Alternatives

[doctrine/collections

PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.

6.0k423.8M1.4k](/packages/doctrine-collections)[symfony/property-access

Provides functions to read and write from/to an object or array using a simple string notation

2.8k309.5M3.0k](/packages/symfony-property-access)[nette/utils

🛠 Nette Utils: lightweight utilities for string &amp; array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.

2.1k417.9M1.7k](/packages/nette-utils)[league/config

Define configuration arrays with strict schemas and access values with dot notation

565323.7M35](/packages/league-config)[cuyz/valinor

Dependency free PHP library that helps to map any input into a strongly-typed structure.

1.5k11.7M155](/packages/cuyz-valinor)[openlss/lib-array2xml

Array2XML conversion library credit to lalit.org

31053.4M49](/packages/openlss-lib-array2xml)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
