How to Sort a Multi-dimensional Array by Value in PHP

Published April 23, 2009 by .

Various methods for sorting a multi-dimensional array in PHP depending on the version of PHP you are using or how the data is organized.

How to Sort a Multi-dimensional Array by Value in PHP

Consider the following Multi-dimensional Array.

php
Array
(
    [0] => Array
    (
        [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
        [title] => Flower
        [order] => 3
    )

    [1] => Array
    (
        [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
        [title] => Free
        [order] => 2
    )

    [2] => Array
    (
        [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
        [title] => Ready
        [order] => 1
    )
)

We wan't to sort this array by the order. This can be done using PHP's usort or array_multisort functions.

If you are on PHP 5.2 or earlier, you'll have to define a sorting function first:

php
function sortByOrder($a, $b) {
    return $a['order'] - $b['order'];
}

usort($myArray, 'sortByOrder');

or

php
$keys = array_column($array, 'order');
array_multisort($keys, SORT_ASC, $array);

Starting in PHP 5.3, you can use an anonymous function:

php
usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

And finally with PHP 7 you can use the spaceship operator:

php
usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

To extend this to multi-dimensional sorting, reference the second/third sorting elements if the first is zero. You can also use this for sorting on sub-elements.

php
usort($myArray, function($a, $b) {
    $retval = $a['order'] <=> $b['order'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});

If you need to retain key associations, use uasort().

Comments

My website and its content are free to use without the clutter of adverts, tracking cookies, marketing messages or anything else like that. If you enjoyed reading this article, or it helped you in some way, all I ask in return is you leave a comment below or share this page with your friends. Thank you.

There are no comments yet. Why not get the discussion started?

We respect your privacy, and will not make your email public. Hashed email address may be checked against Gravatar service to retrieve avatars. This site uses Akismet to reduce spam. Learn how your comment data is processed.