Практика PHP: сравнение строк

PHP неплохо ориентирован на обработку информации. Синтаксис языка представлен полнофункциональным набором функций сравнения, обработки строк, операторами сравнения.

Любой алгоритм - последовательность выборов и действий. Но прежде чем сделать выбор, нужно что-то сравнить с чем-то. Строки - самый емкий, эффективный и практичный механизм управления алгоритмом. Строки - вариант представления данных. А данные - это главный предмет "заботы" любого алгоритма.

Обычная логика "сравнение-действие"

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

В случае контенкации число автоматом сливается со строкой без лишних вопросов и никаких скрытых ошибок, даже если функция gettype () дает 'integer' или 'double'.

Однако есть разница между использованием функции is_int () и is_numeric (). Первая дает истину, когда параметр является только целым числом, вторая, когда любым числом или числовой строкой (переменная имеет тип 'string', но содержит все, что предусмотрено математической нотацией).

Этот простой пример - хороший образец, как на PHP операторы сравнения строк ('==', '===', '!=', ...) могут подарить множество неожиданностей. Переменные могут менять свой тип, они не всегда числа, но почти всегда их можно привести к строке. В крайнем случае - это будет пустая строка.

На основании сказанного, на PHP функция сравнения строк самая популярная. Какую именно выбрать, решать разработчику. Доступна масса вариантов вплоть до регулярных выражений.

Границы доступного функционала

PHP-сравнение двух строк хорошо "делает" функция strpos () - самый дешевый, верный и практичный вариант. Если результат этой функции число, то однозначно одна строка равна другой или одна входит в другую.

Кардинально противоположный, но тоже абсолютно верный подход - использование регулярных выражений.

Если вызов функции $cResult = scCheckFileName($cStr) даст 'true', значит, строка является именем вордовского файла. У него будет только один вариант расширения '.docx' и никаких символов в имени: только буквы, цифры и знаки '_', '-'.

Функция легко может быть переделана на другие виды файлов: $cPtr = '/^([a-zA-Z...0-9\-\_]{4,239})\.(html|js|css|png|jpg|docx|txt){1}$/u'. Такой вариант проверки строки расширяет диапазон загружаемых (например, на PHP сравнение строк применено "для загрузки файлов на сервер, без единого шанса на ошибку ввода") на html, js, css, ...

Использование strpos () и preg_match () - крайности. Они не имеют прямого отношения к вопросу сравнения срок. Но ведь вопрос алгоритма - это вопрос применения комбинации стилей, использование всех возможностей для достижения надежного и правильного результата.

Функционал PHP: сравнение строк

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

Обычный вариант PHP: сравнение строк осуществляет функция int strcmp (s1, s2).

Результат функции:

  • 0 - строки равны;
  • -1 - первая строка меньше второй;
  • 1 - первая строка больше второй.

На практике это означает, что входит первая строка во вторую, от чего функция PHP (сравнение строк) принимает решение. Более ограниченный вариант strpos (), поскольку в последнем случае можно знать позицию вхождения.

Функция strcmp () - регистрозависима. Если нужно сравнить строки без учета регистра символов, PHP предлагает воспользоваться strcasecmp(). Синтаксис аналогичен.

На практике часто требуется работать не со всей строкой, а только с ее частью. Для этого в набор функций PHP (сравнение строк) входит strncmp (s1, s2, N). Третий параметр указывает выполнить сравнение только N-байт. Результат аналогичен strcmp ().

Массивы, строки и сравнение

Данные практически всегда представлены строками. Если рассматривать массивы, объекты, или информационные структуры, то это просто различные варианты комбинации более простых строковых структур.

Строковые массивы и строки могут быть представлены взаимодополняющим образом. Трансформация массива в строку функцией implode(array, symbol), например: $margins1 = implode(', ', $style->getInnerMargin()); ... работа алгоритма/пользователя ...; $margins2 = implode(', ', $style->getInnerMargin()) позволяет слить все позиции объекта в строку позиций.

Затем можно выполнить PHP-сравнение строк и за один раз: $check = strcmp ($margins1, $margins2) и убедиться, что алгоритм или пользователь что-то изменил (или нет). Если выполнять сравнение обычным образом, то придется перебирать элементы массивов. Это происходит дольше и выглядит более громоздко.

Объекты и строки

Еще более эффектное использование PHP (сравнение строк) может быть реализовано посредством объектно-ориентированных идей.

Современное представление об объектах предполагает наличие у них свойств и методов. Первые обычно представлены числами, строками, массивами и другими объектами. Вторые зачастую включают в себя методы записи (put) в строку и восстановления из строки (get).

В отличие от массивов, объект выполняет работу со своими свойствами и взаимодействует с другими объектами. Объект "компетентен" в том, какие его свойства имеют реальное значение для алгоритма, программы в целом.

Этот момент дает основание и возможность при записи фиксировать в строку только нужную информацию, а при восстановлении из строки восстанавливать все рабочие свойства в нужное состояние. Обычно в любом объекте есть информация существенная и рабочая (временная). Реализация такой идеи позволяет экономить не только память, дисковое пространство, записи базы данных, но и делает возможным сравнение строк более простыми и точными средствами.

Синтаксис и семантика

PHP динамично развивается, и его функционал как в плане сравнения строк, так и в отношении их обработки постоянно совершенствуется. Однако ничто не мешает разработчику перенести центр тяжести в область семантики.

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

Комментарии