Search code examples
phparrayssorting

How to have a stable sort in PHP with arsort()?


i need to sort an array in php based on value, array use some numbers for keys and values, for example like this:

$a = array(70 => 1 ,82 => 5  ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);

i like to sort it like this:

Array
(
    [82] => 5
    [13] => 5
    [21] => 4
    [61] => 3
    [34] => 2
    [53] => 2
    [70] => 1
    [55] => 1
)

i used arsort and it worked, but there is a problem because this function make change defult sorted keys and sort array to:

Array
(
    [13] => 5
    [82] => 5
    [21] => 4
    [61] => 3
    [53] => 2
    [34] => 2
    [55] => 1
    [70] => 1
)

Solution

  • Construct a new array whose elements are the original array's keys, values, and also position:

    $temp = array();
    $i = 0;
    foreach ($array as $key => $value) {
      $temp[] = array($i, $key, $value);
      $i++;
    }
    

    Then sort using a user-defined order that takes the original position into account:

    uasort($temp, function($a, $b) {
     return $a[2] == $b[2] ? ($a[0] - $b[0]) : ($a[2] < $b[2] ? 1 : -1);
    });
    

    Finally, convert it back to the original associative array:

    $array = array();
    foreach ($temp as $val) {
      $array[$val[1]] = $val[2];
    }