Вопрос

У меня есть пример массива:

$a = array(
    5   => 35,
    16  => 22,
    7   => 22,
    3   => 22,
    11  => 22,
    9   => 27,
);

И я хочу отсортировать его по ценностям и помнить его ключи. Результат, что я ожидал:

$a = array(
    16  => 22,
    7   => 22,
    3   => 22,
    11  => 22,
    9   => 27,
    5   => 35,
);

Так что моя первая мысль была: asort Действительно Хорошо, я сделал

asort($a);

Но нет - это не просто двигалось 5 => 35 до конца массива. Это изменило мой массив на:

$a = array(
    11  => 22,
    3   => 22,
    7   => 22,
    16  => 22,
    9   => 27,
    5   => 35
);

Понимаете ? Клавиши с одинаковым значением обратятся отсортированы. Почему ?

Это было полезно?

Решение

Вы не можете ожидать определенного порядка сортировки для равных ценностей. Из PHP руководство по сортировке массивов:

Если какая-либо из этих функций сортировки оценивает два члена, как равный, то заказ не определен (сортировка нестабильна).

Другие советы

«Почему» - это еще один вопрос.
Но это на самом деле сделало то, что вы просили, не так ли?
Ключевой порядок не был определен.
Если вы хотите определенный порядок ключей, вы должны указать его в условиях упражнения

http://en.wikipedia.org/wiki/sorting_algorithm#stability.

Короче говоря, убедившись, что порядок уже отсортированных клавиш остается то же самое, что будет стоить время вычисления (и тот, кто спроектировал функцию на PHP, решил, что она не стоит)

В зависимости от алгоритма сортировки, он, вероятно, начал сортировать по-другому, чем просто обнаружить, что он должен переместить только эту одну пару. Но оно закончилось с помощью правильно отсортированного массива поддержания клавиш / значений. Они выглядят только поменяемыми, потому что у вас есть 4 ключа со значениями 22.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top