понедельник, 5 января 2009 г.

asort() – SORT_NUMERIC with non numeric values

Я уже подымал тему сортировок в своём блоге, но придется затронуть ещё одно, казалось бы, «ровное» место. Стояла задача сортировки массива данных по float значению, прямая или обратная, без разницы, но при этом надо было сохранить соотношение ключей и значений.

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

asort($arr, $sort_flags);

В качестве первого параметра передал массив для сортировки, в качестве ключей сортировки указал $sort_flags=SORT_NUMERIC. Отсортировал, вывел данные в таблицу для отображения. Как ни странно, но данные вывелись не в отсортированном порядке. Так как выборка данных была не большая, то смог заметить, что порядок следования всё-таки хаотично поменялся.

Так как ломаться было нечему, функция небольшая, то сразу понял, что проблема была где-то в участке кода с использованием функции asort(). Создал ассоциативный массив из 25 элементов, в котором ключами были простые числа в порядке следования, а в качестве значений были нехитро сгенерированные float числа. Получился следующий массив:

Array
(
  [0] => 0.00
  [1] => 0.00
  [2] => 0.00
  [3] => 55.00
  [4] => 0.00
  [5] => 1.00
  [6] => 0.00
  [7] => 0.00
  [8] => 0.00
  [9] => 0.00
  [10] => 0.00
  [11] => 1.00
  [12] => 0.95
  [13] => 1.00
  [14] => 1.00
  [15] => 0.00
  [16] => 0.00
  [17] => 0.00
  [18] => 0.00
  [19] => 0.00
  [20] => 0.00
  [21] => 0.00
  [22] => 0.00
  [23] => 8.00
  [24] => 0.00
)

После сортировки функцией asort() с ключём SORT_NUMERIC получил следующий результат:

Array
(
  [23] => 8.00
  [3] => 55.00
  [5] => 1.00
  [11] => 1.00
  [14] => 1.00
  [13] => 1.00
  [12] => 0.95
  [22] => 0.00
  [7] => 0.00
  [18] => 0.00
  [4] => 0.00
  [6] => 0.00
  [1] => 0.00
  [19] => 0.00
  [17] => 0.00
  [20] => 0.00
  [10] => 0.00
  [21] => 0.00
  [16] => 0.00
  [15] => 0.00
  [2] => 0.00
  [24] => 0.00
  [8] => 0.00
  [9] => 0.00
  [0] => 0.00
)

И после этого прозрел о_О. Почему элементы не в отсортированном порядке? Пошёл смотреть в PHP-мануал. Но, ни слова не сказано, что функция не будет работать с float числами, она должна одинаково хорошо работать как со string-ами, так и с integer или float объектами для сортировки, для этого лишь нужно использовать соответсвующий ключ сортировки. Для численных параметров нужно использовать именно SORT_NUMERIC, впрочем, как мы и делали. Ладно, попробовал отсортировать в реверсивном порядке при помощи arsort(), а потом просто перевернуть массив. Но результат был аналогичен – НЕ РАБОТАЕТ.

Версия PHP, на котором запускалось – Version 5.2.3.

Any ideas?

Комментариев нет:

Отправить комментарий

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting