PHP asort не работает должным образом? - PullRequest
3 голосов
/ 08 сентября 2010

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

$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
);

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

Ответы [ 4 ]

10 голосов
/ 08 сентября 2010

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

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

2 голосов
/ 08 сентября 2010

http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

Короче говоря,

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

2 голосов
/ 08 сентября 2010

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

1 голос
/ 08 сентября 2010

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

...