Практика PHP: порівняння рядків

Практика 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 динамічно розвивається, і його функціонал як в плані порівняння рядків, так і щодо їх обробки постійно вдосконалюється. Однак ніщо не заважає розробнику перенести центр тяжкості в область семантики.

Безсумнівно, функціонал хороший, але його використання можна перенести в смислову частину коду, в об 'єкти. Коли алгоритм представляється як система взаємодії об 'єктів, це виглядає значно краще, ніж послідовність порівнянь і дій в прямому послідовному, класичному стилі.