PHP asort не работает должным образом?
У меня есть пример массива:
$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 ответа
Вы не можете ожидать определенного порядка сортировки для равных значений. Из руководства PHP по сортировке массивов:
Если любая из этих функций сортировки оценивает два члена как равные, то порядок не определен (сортировка не стабильна).
"Почему" - это другой вопрос.
Но на самом деле он сделал то, что вы просили, не так ли?
Порядок ключей не был определен.
Если вам нужен определенный порядок ключей, вы должны указать это в условиях упражнения.
http://en.wikipedia.org/wiki/Sorting_algorithm
короче говоря, проверка того, что порядок уже отсортированных ключей остается неизменным, будет стоить времени вычисления (и тот, кто разработал функцию в PHP, решил, что это того не стоит)
В зависимости от алгоритма сортировки, он, вероятно, начал сортировку другим способом, чем просто обнаружение, что он должен перемещать только эту единственную пару. Но в итоге получился правильно отсортированный массив с ключами / значениями. они только выглядят поменяны местами, потому что у вас есть 4 ключа со значениями 22
,