Search code examples
phpsortingmultidimensional-arrayusort

PHP reverse sorting sub array by keys


Hey guys I'm trying to reverse sort a multidimensional array with usort but am messing up somewhere. Here's my code:

$array = array(
    array(123 => 'foo'), // duplicate
    array(124 => 'foo'),
    array(127 => 'foo'),
    array(126 => 'foo'),
    array(123 => 'foo'), // duplicate
    array(125 => 'foo'),
);

function rcmp($a, $b) {
    if($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

usort($array, 'rcmp');

print_r($array);

/*
    Array
    (
        [0] => Array ( [126] => foo) )
        [1] => Array ( [125] => foo) )
        [2] => Array ( [127] => foo) )
        [3] => Array ( [123] => foo) )
        [4] => Array ( [124] => foo) )
        [5] => Array ( [123] => foo) )
    )
*/

I am expecting

/*
    Array
    (
        [0] => Array ( [127] => foo) )
        [1] => Array ( [126] => foo) )
        [2] => Array ( [125] => foo) )
        [3] => Array ( [124] => foo) )
        [4] => Array ( [123] => foo) )
        [5] => Array ( [123] => foo) )
    )
*/

What am I doing wrong?


Solution

  • If you want to compare on the array's indexes, you must extract the indexes in the comparison function and reverse the comparison for descending order

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