Новини високих технологій
» » Практика PHP: порівняння рядків

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

13-04-2017, 10:05
805
PHP непогано орієнтований на обробку інформації. Синтаксис мови представлений повнофункціональним набором функцій порівняння, обробки рядків, операторами порівняння.
Будь-який алгоритм - послідовність виборів і дій. Але перш ніж зробити вибір, потрібно щось порівняти з чим-то. Рядка - найбільш ємний, ефективний і практичний механізм управління алгоритмом. Рядки - варіант представлення даних. А дані - це головний предмет "турботи" будь-якого алгоритму.

Звичайна логіка "порівняння-дія"

У загальному випадку мова динамічної типізації не робить особливих розбіжностей в даних, наприклад, на PHP порівняння рядка і числа мало чим відрізняється. Число - це теж рядок, коли в ній містяться тільки цифри, точка і немає жодного символу, який не використовується для представлення числа в будь-якій його формі (математична нотація).


У разі контенкации число автоматом зливається з рядком без зайвих питань і ніяких прихованих помилок, навіть якщо функція gettype () дає 'integer' або 'double'.
Проте є різниця між використанням функції is_int () і is_numeric (). Перша дає істину, коли параметр є лише цілим числом, друга, коли будь-яким числом або числовий рядком (змінна має тип 'string', але містить все, що передбачено математичної нотацією). Цей простий приклад - гарний зразок, як на PHP оператори порівняння рядків ('==', '===', '!=', ) можуть подарувати безліч несподіванок. Змінні можуть змінювати свій тип, вони не завжди числа, але майже завжди їх можна привести до рядку. В крайньому разі - це буде порожній рядок.


Практика PHP: порівняння рядків
На підставі сказаного, на PHP функція порівняння рядків найпопулярніша. Яку саме вибрати, вирішувати розробнику. Доступна маса варіантів аж до регулярних виразів.

Межі доступного функціоналу

PHP-порівняння двох рядків добре "робить" функція strpos () - найдешевший, вірний і практичний варіант. Якщо результат цієї функції число, то однозначно один рядок дорівнює іншій або одна входить в іншу. Кардинально протилежний, але теж абсолютно вірний підхід - використання регулярних виразів.
Якщо виклик функції $cResult = scCheckFileName($cStr) дасть 'true', значить, рядок є ім'ям вордівского файлу. У нього буде тільки один варіант розширення '.docx' і ніяких символів в імені: тільки букви, цифри і знаки '_', '-'. Функція легко може бути перероблена на інші види файлів: $cPtr = '/^([a-zA-Z0-9-_]{4239}).(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 динамічно розвивається, і його функціонал як в плані порівняння рядків, так і стосовно їх обробки постійно вдосконалюється. Однак ніщо не заважає розробнику перенести центр ваги в область семантики. Безсумнівно, гарний функціонал, але його використання можна перенести в змістову частину коду, об'єкти. Коли алгоритм представляється як система взаємодії об'єктів, це виглядає значно краще, ніж послідовність порівнянь і дій у прямому послідовному, класичному стилі.
Цікаво по темі
Математика від JavaScript Math
Математика від JavaScript Math
Об'єкт Math мови jаvascript реалізує практичний набір математичних функцій. Складні розрахунки можна виконувати всередині браузера, не
JavaScript, масиви: опис
JavaScript, масиви: опис
jаvascript – сучасна мова програмування, він унікальний у частині синтаксису і семантики. Має специфіку...
Рядковий оператор в Pascal - string
Рядковий оператор в Pascal - string
Програмування постійно пов'язане з роботою з деякими даними, зокрема, з рядками. Рядковий оператор задається однаково в більшості мов, у тому числі в
Ефективне програмування на PHP: масиви в рядок
Ефективне програмування на PHP: масиви в рядок
PHP, як сучасна мова програмування, надає можливість обробляти дані, тип яких можна визначити в момент ...
Що робить функція SQL CONCAT?
Що робить функція SQL CONCAT?
Робота з базами даних постійно пов'язана з отриманням результатів запитів. І в деяких випадках цю інформацію необхідно вивести на екран певним чином,
Javascript Array для збереження необмеженої кількості змінних
Javascript Array для збереження необмеженої кількості змінних
Логічно масив займає проміжне положення між змінними і об'єктами. Практично не слід надавати особливого значення словам. У програмі є змінні і код.