PHP usort() order in case of equality



PHP Snippet 1:

// sample array 
$arr = Array("a" => 0.57,"b" => 1.19,"c" => 0.57,"d" => 0.57,"e" => 0.57,"f" => 0.57,"g" => 0.57,"h" => 0.57,"i" => 0.99,"j" => 1.19,"k" => 1.19);
    $multi_arr = [];
    foreach ($arr as $k=>$val){
       $multi_arr["$val"][] = array($k=>$val); 
    }
    uksort($multi_arr, function ($a, $b) { 
                    return $b > $a ? 1 : -1;
            });
    $s_arr = [];
    foreach ($multi_arr as $k=>$val){
        foreach($val as $p_id){         
            $p_arr = array_keys($p_id);
            $s_arr[] = $p_arr[0]; 
        }
    }
print_r($s_arr);

PHP Snippet 2:

function array_sort_by_number(&$array, $key = 'weight', $order = 'a') {
  $increments = [];
  foreach ($array as &$c_item) {
    $c_value = is_object($c_item) ? $c_item->{$key} : $c_item[$key];
    if ($order === 'a') $increments[$c_value] = array_key_exists($c_value, $increments) ? $increments[$c_value] - .0001 : 0;
    if ($order === 'd') $increments[$c_value] = array_key_exists($c_value, $increments) ? $increments[$c_value] + .0001 : 0;
    if (is_object($c_item)) $c_item->_synthetic_weight   = $c_value + $increments[$c_value];
    else                    $c_item['_synthetic_weight'] = $c_value + $increments[$c_value];
  }
  uasort($array, function ($a, $b) use ($order) {
    if ($order === 'a') return (is_object($b) ? $b->_synthetic_weight : $b['_synthetic_weight']) <=> (is_object($a) ? $a->_synthetic_weight : $a['_synthetic_weight']);
    if ($order === 'd') return (is_object($a) ? $a->_synthetic_weight : $a['_synthetic_weight']) <=> (is_object($b) ? $b->_synthetic_weight : $b['_synthetic_weight']);
  });
  foreach ($array as &$c_item) {
    if (is_object($c_item)) unset($c_item->_synthetic_weight);
    else                    unset($c_item['_synthetic_weight']);
  }
  return $array;
}

PHP Snippet 3:

$test = [
  'a' => ['weight' =>  4],
  'b' => ['weight' => 10],
  'c' => ['weight' => 10],
  'd' => ['weight' => 10],
  'e' => ['weight' =>  4],
];
$test_result = [
  'b' => ['weight' => 10],
  'c' => ['weight' => 10],
  'd' => ['weight' => 10],
  'a' => ['weight' =>  4],
  'e' => ['weight' =>  4],
];
array_sort_by_number($test, 'weight', 'a');
print_R($test);
var_dump($test === $test_result);

$test = [
  'a' => ['weight' =>  4],
  'b' => ['weight' => 10],
  'c' => ['weight' => 10],
  'd' => ['weight' => 10],
  'e' => ['weight' =>  4],
];
$test_result = [
  'a' => ['weight' =>  4],
  'e' => ['weight' =>  4],
  'b' => ['weight' => 10],
  'c' => ['weight' => 10],
  'd' => ['weight' => 10],
];
array_sort_by_number($test, 'weight', 'd');
print_R($test);
var_dump($test === $test_result);