How to sort associative array in PHP

In the article about how to sort an array in PHP,  we saw several functions for sorting an array. Some of these functions are useful for sorting an associative array, either by key or by value. Here’s a throwback to those functions.

  • asort() – Sorts an associate array by value, in ascending order.
  • arsort() – Sorts an associative array by value, in descending order.
  • ksort() – Sorts an associate array by key, in ascending order.
  • krsort() – Sorts an associate array by key, in descending order.

In this article about how to sort associative array in PHP, we’ll extend upon the previous article and see some more advanced functions. These functions are usually helpful in sorting multi-dimensional associative arrays. We’ll be using an array of inventory items in the examples.

Inventory Items

Here’s how the array looks like.

$inventory_items = array(
    array("ProductName"=>"White Sneakers","InStock"=>25,"Price(USD)"=>100),
    array("ProductName"=>"Metal Ring","InStock"=>15,"Price(USD)"=>50),
    array("ProductName"=>"Denim Jeans","InStock"=>10,"Price(USD)"=>40),
    array("ProductName"=>"Wooden Table","InStock"=>7,"Price(USD)"=>132),
    array("ProductName"=>"Gaming Chair","InStock"=>8,"Price(USD)"=>200),
);

What if we need to sort these products by Price(USD) or InStock? The functions listed above won’t help us get around this problem. So, we’ll see functions that would help in sorting this multi-dimensional inventory items array.

Option#1 – Sort associative array using usort function

PHP usort function takes a function as an argument and thus, sorts an array based on the return value of that function. 

Description

Sorts an array by values based on a user-defined function.

usort(array &$array, callable $callback): bool

Arguments

  • $array      – Array to be sorted
  • $callback User-defined comparison function 

Return Types

The function always returns true.

The callback function

The $callback is a crucial argument of usort. It is a user-defined function that returns values less than, equal to, or greater than zero depending if the first value is less than, equal to, or greater than the second value. Here’s the function signature.

callback(mixed $a, mixed $b): int

 We’ll define a function for usort that will sort the array by Price(USD).

//Callback function for usort
function sortByPrice($item1,$item2)
{
    //If the prices are same return 0.
    if($item1["Price(USD)"] == $item2["Price(USD)"]) return 0;
    //If price of $item1 < $item2 then return -1 else return 1.
    return $item1['Price(USD)'] < $item2['Price(USD)'] ? -1 : 1;
}

Example

Next, we’ll pass the inventory items array to usort along with the callback function. 

//usort will sort this array by Price(USD)
usort($inventory_items,"sortByPrice");

Here’s the output.

/*
OUTPUT
Array
(
    [0] => Array
        (
            [ProductName] => Denim Jeans
            [InStock] => 10
            [Price(USD)] => 40
        )
 
    [1] => Array
        (
            [ProductName] => Metal Ring
            [InStock] => 15
            [Price(USD)] => 50
        )
 
    [2] => Array
        (
            [ProductName] => White Sneakers
            [InStock] => 25
            [Price(USD)] => 100
        )
 
    [3] => Array
        (
            [ProductName] => Wooden Table
            [InStock] => 7
            [Price(USD)] => 132
        )
 
    [4] => Array
        (
            [ProductName] => Gaming Chair
            [InStock] => 8
            [Price(USD)] => 200
        )
 
)
*/

The inventory items are sorted in ascending order. It is also possible in descending order too. However, we’ll leave it for you. 

Hint: Modify the callback function to change the sorting order.

You’re aware of usort and, most importantly, the callback function. Thus, you can test yourself by defining a callback function for sorting the same array by InStock. Pat yourself on the back if you’re able to do this challenge.

For PHP 7+ users

Before moving to the next function, here’s a quick note for PHP 7+ users. You can use the spaceship operator to simplify the callback function. Here’s how to reproduce the same callback function with the spaceship operator.

//Callback function for usort
function sortByPrice($item1,$item2)
{
    
    if($item1["Price(USD)"] <==> $item2["Price(USD)"]) return 0;
    
}

The spaceship operator is <==>, and it returns 0 if both the operands are equal, 1 if the left operand is greater, and -1 if the right operand is greater.

Option#2 – Sort associative array using array_multisort

PHP array_multisort is yet another helpful function for sorting multi-dimensional associative arrays. 

Description

Sorts multi-dimensional or multiple arrays.

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags = SORT_REGULAR,
    mixed ...$rest
): bool

Arguments

  • &$array1 – An array being sorted
  • $array1_sort_order The sorting order of the previous array argument. By default, it is SORT_ASC
  • $array1_sort_flags –  Flag for specifying the mode of sorting. By default, SORT_REGULAR
  • $rest – Array’s elements corresponding to the previous array argument are compared. 

Return Type

Returns true on success and false on failure.

Example

Here’s an example of using the array_multisort function.

//Define an array for prices.
$prices = array();
 
//Loop through the array to get prices in the prices array.
foreach($inventory_items as $key=>$value)
{
    $prices[$key] = $value["Price(USD)"];
}
 
array_multisort($prices,$inventory_items);
 
print_r($inventory_items);

Here’s the output.

Array
(
    [0] => Array
        (
            [ProductName] => Denim Jeans
            [InStock] => 10
            [Price(USD)] => 40
        )

    [1] => Array
        (
            [ProductName] => Metal Ring 
            [InStock] => 15
            [Price(USD)] => 50
        )

    [2] => Array
        (
            [ProductName] => White Sneakers
            [InStock] => 25
            [Price(USD)] => 100
        )

    [3] => Array
        (
            [ProductName] => Wooden Table
            [InStock] => 7
            [Price(USD)] => 132
        )

    [4] => Array
        (
            [ProductName] => Gaming Chair
            [InStock] => 8
            [Price(USD)] => 200
        )

)

The array is sorted in ascending order. We can see a foreach loop in the code for extracting the prices in an array of its own. In PHP version 5.5.0 and beyond, the foreach loop can be replaced with array_column. Thus, this function does the same job as the foreach does here.

Sort associative array by keys using uksort

PHP uksort function is similar to usort except that it sorts the array by keys. The anatomy of the function is pretty much similar to the usort. So, let’s use it to sort an associative array by key.

<?php
$names_score = array("Edward"=>10,"Bob"=>20,"Kylie"=>30,"Robert"=>40,"William Shakespear"=>50);
 
 
//Callback function for uksort
function sortByLength($key1,$key2)
{
    //If the prices are same return 0.
    if(strlen($key1) == strlen($key2)) return 0;
    //If length of $key1 < $key2 then return -1 else return 1.
    return strlen($key1) > strlen($key2) ? -1 : 1;
}
 
 
uksort($names_score,"sortByLength");
 
print_r($names_score);
 
/*
OUTPUT
Array
(    
    [William Shakespear] => 50
    [Edward] => 10
    [Robert] => 40
    [Kylie] => 30
    [Bob] => 20
)
*/
?>

The callback function compares the name’s strings by length. Finally, uksort sorts the array by keys in descending order.

Conclusion

Besides the functions that we had seen in a previous article, in this article, we’ve seen usort and array_multisort functions for sorting a multi-dimensional associative array. We have also seen uksort for sorting an array by key values. So hopefully, you might have learned something new today. Stay tuned for more awesome PHP articles.

Want to explore more useful PHP tutorials?

We have many fun articles related to PHP. You can explore these to learn more about PHP.

PHP serialize vs json_encode

How to take form inputs and put them into a PHP associative array

How to put values in an associative array into another array in PHP


Article Categories

Article Tags

© 2022 Confident.Systems