Помимо использования массивов как простых списков, массивы РНР также весьма удобны, когда вы имеете дело с данными в форме таблиц. В этом разделе вы научитесь реализовывать простые таблицы средствами массивов РНР. Затем будет рассмотрен более сложный пример разработки базирующихся на массивах таблиц, которые могут быть отсортированы по нужной колонке с помощью РНР-функций сортировки массивов. Рассмотрим табл. 2.1.
Таблица 2.1. пример таблицы животных Имя животного - Имя владельца - Вес - Животное Бим - Иванов - 9 - Собака Василий - Петрова - 4 - Кот Рекс - Сидоров - I - Игуана Бастер - Собакевич - 23 - Собака Алиса - Кошкина - 14 - Собака
Посмотрите внимательно на таблицу. Как ее реализовать с помощью массивов РНР? Простейший способ — создать ассоциативный массив (на базе имени каждого животного), значения которого будут другими массивами, содержащими остальные данные каждой строки, как показано в листинге 2.14.
Проблема со структурой массива состоит в том, что она никак не помогает в сортировке по определенной колонке. Как показано в листинге 2.15, чтобы воспользоваться встроенной функциональностью, каждая колонка должна сохраняться в отдельном массиве (сохраняя ключевые значения таким образом, чтобы индекс 1 для каждого массива соответствовал правильному значению).
Сравните листинги 2.14 и 2.15. Первая вещь, которая, вероятно, сразу заметна, —это то, что второй листинг значительно понятнее первого. Более того, поскольку каждая колонка таблицы представлена отдельным массивом РНР, каждая колонка также может быть отсортирована с применением встроенных функций работы с массивами. Для выполнения этой сортировки можно воспользоваться PHP-функцией asort (). Несмотря на то что разработчику на РНР доступно множество функций сортировки, эта конкретная функция выбирается на основании одной важной детали — она поддерживает ассоциативные пары ключ/значение (см. описание array_filter () ранее в настоящей главе, чтобы понять важность этого обстоятельства). Синтаксис asort () выглядит следующим образом: asort($input [, $sort flag]);
НА ЗАМЕТКУ Функция asort () упорядочивает массив от меньшего значения к большему (или в алфавитном порядке — от А до Z). Если требуется противоположное поведение, можно использовать функцию arsort (), которая аналогична asort ().
$ input представляет массив, который нужно сортировать, a $sort_flag — это необязательный параметр (константа), указывающий тип выполняемой сортировки. Обратите внимание, что константы, значения которых принимает параметр $sort_flag, не являются переменными РНР. Это константы, предопределенные в РНР (больше всего это похоже на то, что можно определить с помощью директивы define). Три возможных значения параметра $sort_f lag перечислены в табл. 2.2.
Таблица 2.2. Константы asort () Константа Описание SORT_REGULAR Сравнивает элементы нормально (по умолчанию). SORT_NUMERIC Сравнивает элементы как числовые значения. SORTSTRING Сравнивает элементы как строчные значения.
При выполнении функция asort () отсортирует массив $input так, как указано флагом $sort_f lag (возвращаемого значения нет). Использование функции asort () для сортировки и поддержки вашей табличной структуры становится относительно простой задачей, поскольку каждая колонка вашей таблицы хранится в отдельном массиве. Примените asort () для сортировки по любой из колонок, а затем с помощью foreach () отобразите отсортированные данные в HTML-таблице, как показано в листинге 2.16, в котором выполняется сортировка таблица по колонке веса.
Листинг 2.16. Сортировка таблицы, хранящейся в массивах, с использованием asort ()
CopTHpoBKa массивовТ1ТЬЕХ/НЕА0>
<Н2>Сортировка массивов с использованием функции asort()
$petshack['name'] = array('Бим', 'Василий', 'Рекс', 'Бастер', 'Алиса'); $petshack['owner'] = array('Иванов', 'Петрова', 'Сидоров1, 'Собакевич', 'Кошкина'); $ p e t s h a c k [ ' w e i g h t ' ] = array(20, 10, 3, 54, 30); $petshack['animal'] = array('Собака',. 'Кот', 'Игуана', 'Собака', 'Собака'); /* Сортировать по весу •*/
Заменяя массив, передаваемый функции asort () (и соответственно изменяя foreachO для прохождения по массиву, который должен быть отсортирован), этот сценарий можно модифицировать с минимальными затратами для выполнения сортировки по любой из колонок.