Sorting 2D associative arrays in PHP

Surprisingly, it took me a long time to find this solution so I decided to post it for anyone who had a situation similar to mine.

Let’s say you have the following 2D associative array in PHP of fruits and their corresponding prices and you want to have them sorted by price:

$fruits = array
(
    [0] => array
        (
            ['product'] => 'banana',
            ['price']     => 2.99
        ),
    [1] => array
        (
            ['product'] => 'apple',
            ['price']     => 1.99
        ),
    [2] => array
        (
            ['product'] => 'durian',  //these smell by the way - i do not know how people can like them =)
            ['price']     => 19.99
        ),
    [3] => array
        (
            ['product'] => 'starfruit', //not too stinky but still stinky nonetheless
            ['price']     => 5.99
        )
);


The answer to this one involves the use of the PHP function, usort, which allows users to define their own comparison function for sorting arrays of all shapes and sizes.

For this example, our function would need to be defined as the following if we wanted to have the prices descending:

function sortDescending ($a, $b)
{
    if ($a['price'] == $b['price']) {
        return 0;
    }
    return ($a['price'] > $b['price']) ? -1 : 1;
}

Here is the slightly different version of the function for an ascending sort:

function sortAscending ($a, $b)
{
    if ($a['price'] == $b['price']) {
        return 0;
    }
    return ($a['price'] < $b['price']) ? -1 : 1;
}

To put it all together in a descending sort, we have the following:

function sortDescending ($a, $b)
{
    if ($a['price'] == $b['price']) {
        return 0;
    }
    return ($a['price'] > $b['price']) ? -1 : 1;
}
usort($fruits, "sortDescending");
 
foreach ($fruits as $fruit) {
    echo $fruit['product'] . ": " . $fruit['price'] . "\n";
}

This would give us the following output:

durian: 19.99
starfruit: 5.99
banana: 2.99
apple: 1.99

Published by

Allen Liu

Building websites is a passion of mine. During the course of my work, I have created some snippets of code that I hope will prove useful to other developers.

Leave a Reply

Your email address will not be published. Required fields are marked *