Search code examples
phparrayssortingmultidimensional-array

PHP Sort Array By SubArray Value


I have the following array structure:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

What is the best way to order the array in an incremental way, based on the optionNumber?

So the results look like:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

Solution

  • Use usort.

    function cmp_by_optionNumber($a, $b) {
      return $a["optionNumber"] - $b["optionNumber"];
    }
    
    ...
    
    usort($array, "cmp_by_optionNumber");
    

    In PHP ≥5.3, you should use an anonymous function instead:

    usort($array, function ($a, $b) {
        return $a['optionNumber'] - $b['optionNumber'];
    });
    

    Note that both code above assume $a['optionNumber'] is an integer. Use @St. John Johnson's solution if they are strings.


    In PHP ≥7.0, use the spaceship operator <=> instead of subtraction to prevent overflow/truncation problems.

    usort($array, function ($a, $b) {
        return $a['optionNumber'] <=> $b['optionNumber'];
    });