Секреты PHP-функций для работы с массивами. Обработка данных и сортировка
[cекреты PHP-функций для работы с массивами]материал подготовил: А. В. Кириллов 15.11.2005
итак, что же там с вашим менеджером, который был упомянут в анонсе статьи? Вы уже написали ту самую злополучную версию функции для перекодировки какого-то поля в XML-файле. Но вечером того же дня оказывается, что надо срочно поменять логику работы скрипта, который уже закачан на сервер, протестирован вашим инженерным составом и одобрен чуть ли не самим генеральным директором фирмы. В противном случае вся торговая деятельность вашего предприятия может быть просто парализована (случай из жизни одного знакомого администратора). В таком случае, если вам пришлось написать приложение на каком-то IDE вроде Delphi или Clarion, остается только собраться и приехать в офис, чтобы внести необходимые изменения. Зачем ехать, спросите вы? Все очень просто — начальник отдела безопасности категорически запретил выносить данные, и вы просто выполнили его очередной приказ. Для получения полной картины произошедшего представьте себе написанный на PHP сценарий разбора этого самого XML-файла. Вы просто упрашиваете вашего дежурного администратора отрыть доступ (по SSH, например, или с помощью того же MS-RDP) к вашему скрипту. В случае если у вас UNIX-сервер, то просто достаточно внести изменения и проверить работоспособность вашего приложения «не выходя с сервера». Конечно, может показаться, что приведенный выше пример слегка притянут за уши и не может никогда приключиться с вами. Но все же можно представить, насколько проще станет оперативно получать доступ к подконтрольным задачам (например, из другой страны или в дороге), если вы пользуетесь PHP, а не более «тяжелыми» средствами.
Для обеспечения достаточно высокого быстродействия при выполнении веб-скриптов иногда нужно отказаться от использования баз данных и выполнять операции по обработке матричных представлений информации с помощью массивов. В предыдущей статье цикла «Секреты PHP» речь шла о процессе создания массивов и о связанных понятиях ассоциативности и многомерности табличных данных. В этой статье я постараюсь продемонстрировать методы обработки табличных данных. Также будет сделан упор на функции, предназначенные для сортировки массивов.
Зачем это надо
итак, приведу свою классификацию (за неимением стандартной) типов функций PHP, которые предназначены для сортировки и обработки данных, содержащихся в массивах.
информационные функции. Например, получение количества элементов.
Преобразование различных типов данных в массивы и наоборот. Этот тип функций позволяет, например, перейти от строкового представления к массиву значений.
Методы, предназначенные для слияния и разбиения массивов.
Сортировка данных. Функции для сортировки позволяют выполнять манипулирование вашими массивами, как ассоциативного типа, так и с обычным, последовательным, ключом.
Обработка (групповая) данных. Функции типа callback, которые входят в этот тип, дают вам возможность применить написанную вами функцию к выбранным элементам массива (или ко всем последовательно) одной операцией.
Заполнение данными — инициализация массивов. В PHP нет такого понятия, как указание первоначальной размерности массива. Это, с одной стороны, позволяет серьезно экономить память, выделяемую при обработке скрипта на PHP, но с другой — может привести к блокировке его работы при превышении выделенным объемом памяти какого-либо граничного значения. Для начальной инициализации данными в состав языка включено сразу несколько необходимых функций.
Функции для перемещения по (внутреннему) индексу массива.
Кроме указанных видов существуют также несколько функций, которые позволяют провести рекурсивный анализ многомерного масс
ива и выполнить некоторые другие сложные действия. Несмотря на их низкую востребованность, про них, конечно, не следует забывать. Рекомендуется перед выполнением какой-либо обработки табличных данных пересмотреть весь состав функций, который доступен в вашей версии PHP. Вполне вероятно, что вы натолкнетесь на нужную вам возможность.
Классификация типов функций для работы с массивами
Для обеспечения нужного уровня безопасности вашего приложения иногда бывает нужно проверять передаваемые в ваши процедуры значения. Также часто для последовательного перебора значений массива может понадобиться узнать его размер. В таком случае при написании необходимой программы вам просто не обойтись без группы функций, которые предоставляют характеристики массивов:
is_array — эта функция проверяет, действительно ли переданное значение является массивом;
array_keys — получение массива с ключами. Эта функция позволяет перебрать все элементы ассоциативного массива, у которого в качестве ключа используется непоследовательный числовой ряд;
count (или sizeof) — получение количества элементов массива;
in_array — проверка, есть ли в указанном массиве нужное вам значение (которое, в свою очередь, также может быть массивом);
array_count_values — подсчет значений массива («свертка по значению»). Возвращает ассоциативный массив, в качестве ключа которого используются значения из переданного параметра. В качестве значений результата выполнения функции будет число найденных таких значений. Удобно для подсчета в финансовых функциях.
Несмотря на то что многие функции не относятся к группе, которая предназначена именно для оперирования массивами, с их помощью можно выполнять различные операции вроде конвертации периодических данных в табличное представление. Например, такие функции, как preg_match (операция сравнения с регулярным выражением), позволяют получить массив из строкового представления. При программировании нетривиальных задач следует помнить про особенность языка PHP, состоящую в очень большой функциональной наполненности и массе предоставляемых пользователю возможностей, и пользоваться самой последней версией документации. итак, какие функции могут вам пригодиться для преобразования данных в массивы и наоборот:
explode — преобразование строки в массив. При этом вы можете преобразовать в массив, например, CSV-строку (данные, разделенные точкой с запятой);
implode (join) — «склеивание» элементов массива в строку. используя эту функцию в комплексе с file, можно преобразовать содержимое файла в строку. Join — это полный синоним функции implode;
split, preg_split — разбиение строки по регулярному выражению*. Эти функции позволяют преобразовать нетривиально представленные данные в массив. Например, можно конвертировать в табличное представление строковое выражение, не разделенное никакими специальными символами. В общем случае вторая функция работает несколько быстрее первой (по крайней мере, так утверждает документация по PHP);
array_combine — преобразование двух простых массивов в один ассоциативный, используя значения первого в качестве ключей для него, а соответствующие значения второго в качестве наполнителя значений итогового массива.
Для удобства оперирования табличными значениями необходимо иметь возможность выполнения таких операций, как разбиение таблицы на части. В противном случае реализация необходимой функциональности сильно затруднила бы жизнь простым кодерам, каждодневно выполняющим разнообразные операции с табличными данными. Конечно, всегда можно создать свое ядро функций и придерживаться строго его. Но в случае больших проектов такой вариант менее предпочтителен, чем использование готовой функциональности интерпретатора. Следующие функции как раз и позволяют выполнять такие операции, как слияние и разбитие массивов:
array_merge_recursive — рекурсивное слияние нескольких массивов;
array_merge — объединение нескольких массивов;
array_chunk — разбиение массива на части;
array_diff — простой анализ расхождений массивов;
array_diff_assoc, array_diff_key, array_diff_uassoc, array_diff_ukey — функции для сравнения массивов. Первая позволяет вычислить расхождения с проверкой индекса, вторая позволяет выполнить анализ по ключу, а третья и четвертая используют вызов определяемой пользователем функции для анализа расхождений значений и ключей массива. Эти функции позволяют, к примеру, провести семантический анализ вводимых данных путем вычленения неверно набранных символов или слов из набираемой фразы на основе пользовательского словаря;
array_intersect_* — группа функций, выполняющих операцию пересечения матричных данных. Позволяет, например, проводить операции анализа статистических данных.
Слияние, разбиение, сравнение
Функции этого типа необходимы для выполнения операций редактирования массивов. Вам в любой момент может понадобиться набор процедур для удаления данных из массива или получения какой-либо табличной выборки. именно для этого и предназначена данная группа функций:
array_change_key_case — преобразование регистра символов ключей массива. По умолчанию ключи преобразуются в нижний регистр. Но если в качестве второго параметра для этой функции указать 1, то вы получите массив с ключами в верхнем регистре. Корректно обрабатываются и строки, набранные в кириллице;
array_multisort — сортировка нескольких массивов одновременно. Позволяет также обрабатывать многомерные массивы;
array_slice — получение среза массива;
array_flip — обмен значений местами;
array_map — применение пользовательской функции ко всем элементам массива. Так, например, можно убрать лишние пробелы из массива текста, каждая строка которого представляет собой строку текста (результат работы функции file);
array_splice — замена определенных элементов массива другими значениями;
array_unique — удаление повторяющихся значений.
Обработка данных
Для операций вроде заполнения массива списком значений можно, конечно, использовать цикл for и в его теле выполнить нужные операции. Однако для облегчения вашего кода специально для таких рутинных задач PHP предлагает целый ряд возможностей. Приведу лишь краткий список функций, который не претендует на законченность, но даст вам представление про всю мощь этого механизма:
array_pad — увеличение размера массива до указанной величины. Функция может быть чрезвычайно полезна при тестировании выделения памяти вашему скрипту;
range — заполнение массива диапазоном значений. Вы можете присвоить первому элементу массива значение 1, второму — 2 и так далее;
list — эта синтаксическая конструкция языка PHP позволяет присвоить списку переменных значения в одной операции.