Сортируем двумерные массивы

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

Но зачем нужно использовать массивы? Автор этой статьи столкнулся с такой задачей, когда нужно было сортировать данные в виде двумерных массивов, полученных из данных в WDDX формате. Мы всегда стараемся угодить пользователю, поэтому был проведен поиск в Интернете готовых решений, показывающих возможность такой сортировки. Было найдено и протестировано несколько примеров и, пользователям пообещали, что они смогут сортировать данные в удобном для них формате, щелкая мышкой по заголовкам колонок с информацией.

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

Создавая первоначальный массив, нужно добавить в каждой колонке шестой ряд:

Шестой ряд будет использоваться как ряд для сортировки. Каждый раз при запросе страницы, этот ряд будет заполняться информацией из той колонки, которую мы хотим отсортировать. Чтобы убедиться, что информация всегда уникальна, используется индекс цикла cfloop для создания одномерного массива с добавленной сортированной информацией в новом ряду:

 

Определяем колонку и порядок сортирования

Для начала хорошо бы разобраться, как происходит процесс сортировки.

Каждое из названий колонки отображается пользователю в виде гиперссылки. Гиперссылки снова запрашивают текущую страницу, передавая ей номер сортируемой колонки (переменная sort_column). Каждый раз при запросе страницы происходит проверка наличия номера сортируемой колонки и, если его нет, то по-умолчанию этот номер равен единице:
Для обеспечения возможности указывать порядок сортировки по возрастанию (asc) или по убыванию (desc), через адресную строку передается еще один параметр - sort_order. По-умолчанию используется значение asc:

 

Вернемся к процессу сортировки

Теперь у нас есть колонка с уникальной информацией, которая может использоваться к связующий ключ между оригинальным и отсортированным массивом. Используя новый ряд, мы создаем временный одномерный массив tempmasarray и наполняем его данным, отсортированными в нужном нам порядке:

Последним шагом осталось создать новый двумерный массив, используя временный одномерный массив tempmasarray. Для осуществления этой операции используется два цикла cfloop. Первый цикл проходит по массиву tempmasarray, а второй – берет значение из массива tempmasarray и ищет его в оригинальном массиве. Когда совпадение найдено, то информация о найденном элементе добавляется в новый массив. По завершении цикла мы получаем массив sortedsalesarray – точная копия оригинального, но уже отсортированного массива:
Конечно, как всегда есть альтернативное решение проблемы – хранение информации в результате запроса, используя функции QueryNew и QuerySetCell, а также применяя такую возможность ColdFusion, как запрос к запросу. Использование такого решения зависит от данных и типа их обработки.

 

Заключение

Описанная в этой статье возможность не часто используется ColdFusion программистами и не рекомендуется к использованию, если вы получаете данных из запросов к базе данных. По возможности, ответственность за сортировку данных всегда рекомендуется возлагать на базу данных. Но, если нужная вам информация находится на другом сервере и вы используете WDDX или Веб службы, чтобы получить ее и отобразить в нужной последовательности, то это решение будет как нельзя кстати. Сортируя данные на локальном ColdFusion сервере, вы сократите количество запросов к удаленному серверу.


Источник: Sorting Multidimensional Arrays

 


Hosted by uCoz