Как получить стабильный вид в PHP с помощью arsort ()?

Мне нужно отсортировать массив в php на основе значения , массив использует некоторые числа для ключей и значений, например:

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

Мне нравится сортировать его следующим образом :

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

Я использовал arsort и это сработало, но есть проблема, потому что эта функция делает изменения defult отсортированными ключами и массивом сортировки:

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

Solutions Collecting From Web of "Как получить стабильный вид в PHP с помощью arsort ()?"

Построить новый массив, элементами которого являются ключи, значения, а также позиция:

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

Затем выполните сортировку с использованием пользовательского порядка, учитывающего исходную позицию:

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

Наконец, преобразуйте его обратно в исходный ассоциативный массив:

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

Это связано с тем, что sort семейство функций нестабильно . Если вам нужно, чтобы сортировка была стабильной, вам нужно либо реализовать ее самостоятельно, либо перебрать отсортированный результат и «исправить» позиции элементов с помощью array_splice .

Для справки я поставил набор стабильных вариантов сортировки встроенных функций PHP на Github: https://github.com/vanderlee/PHP-stable-sort-functions , основанный на решении @ Barmar и несколько других трюков.

Это своего рода обходное решение, но оно действительно работает:

 $a = array(70 => 1 ,82 => 5 ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5); $b = max($a); $c = min($a); $d = 0; $sorted_list = array(); while($b >= $c){ foreach($a as $key => $value){ if($value == $b){ $sorted_list[$key] = $value; } } $b--; } 

vardump output:

 array(8) { [82]=> string(1) "5" [13]=> string(1) "5" [21]=> string(1) "4" [61]=> string(1) "3" [34]=> string(1) "2" [53]=> string(1) "2" [70]=> string(1) "1" [55]=> string(1) "1" } 

Простое решение с array_multisort .

 $assoc = [ 70 => 1, 82 => 5, 61 => 3, 55 => 1, 34 => 2, 53 => 2, 21 => 4, 13 => 5, ]; $keys = array_keys($assoc); array_multisort($assoc, SORT_DESC, range(1, count($assoc)), $keys); $assoc = array_combine($keys, $assoc); print_r($assoc); 

Вы можете создать свою собственную функцию сортировки для соответствия вашим настроенным критериям сортировки, а затем использовать usort () для итерации по всему массиву с помощью функции, которую вы создали для сортировки массива.