Мне нужно отсортировать массив в 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 )
Построить новый массив, элементами которого являются ключи, значения, а также позиция:
$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 () для итерации по всему массиву с помощью функции, которую вы создали для сортировки массива.