Інтернет Windows Android

Строкові функції. Практика PHP: порівняння рядків Php порівняння рядків

Порівнює рядки.

синтаксис:

Int strcmp (string str1, string str2)

substr_compare ()

Безпечне для обробки даних в двійковій формі порівняння 2 рядків зі зміщенням, з урахуванням або без урахування регістру (PHP 5)

опис:

Int substr_compare (string main_str, string str, int offset [, int length [, bool case_sensitivity]])

substr_compare () порівнює рядок main_str починаючи з символу, номер якого заданий аргументом offset, з рядком str. У порівнянні беруть участь максимум length символів.

Повертає число 0 якщо вона більше str, і 0 якщо рядки рівні. Якщо length більше або дорівнює довжині main_str і offset переданий, substr_compare () виводить попередження і повертає FALSE.

Якщо case_sensitivity має значення TRUE, порівняння виконується з урахуванням регістра.

Приклад використання substr_compare ()

echo substr_compare ( "abcde", "bc", 1, 2); // 0
echo substr_compare ( "abcde", "bcg", 1, 2); // 0
echo substr_compare ( "abcde", "BC", 1, 2, true); // 0
echo substr_compare ( "abcde", "bc", 1, 3); // 1
echo substr_compare ( "abcde", "cd", 1, 2); // -1
echo substr_compare ( "abcde", "abc", 5, 1); // warning
?>

Порівнює початку рядків.
синтаксис:

Int strncmp (string str1, string str2, int len)

Ця функція відрізняється від strcmp () тим, що порівнює не всі слово цілком, а перші len байтів. У разі, якщо len менше довжини найменшої з рядків, то рядки порівнюються цілком.
Ця функція порівнює два рядки посимвольний (точніше, бобайтово) і повертає:

0 - якщо рядки повністю збігаються;

1 - якщо рядок str1 лексикографічно менше str2;

1 - якщо, навпаки, str1 "більше" str2.

Так як порівняння йде побайтово, то регістр символів впливає на результати порівнянь.

strcasecmp

Порівнює рядки без урахування регістру.
синтаксис:

Int strcasecmp (string str1, string str2)

Те ж саме, що і strcmp (), тільки при роботі не враховується регістр букв.

$ Str1 \u003d "Привіт!";
$ Str2 \u003d "привіт!";
if (! strcesecmp ($ str1, $ str2))
echo "$ str1 \u003d\u003d $ str2 при порівнянні рядків без урахування регістру";

strncasecmp

Порівнює початку рядків без урахування регістру.
синтаксис:

Int strncasecmp (string str1, string str2, int len)

Функція strncasecmp () є комбінацією функцій strcasecmp () і strncmp ().

strnatcmp

Виробляє "природне" порівняння рядків.
синтаксис:

Int strnatcmp (string str1, string str2)

Ця функція імітує порівняння рядків, яке використовував би людина.

$ Arr1 \u003d $ arr2 \u003d array ( "img12.png", "img10.png", "img2.png", "img1.png");
echo "Звичайна сортіровкаn";
usort ($ arr1, "strcmp");
print_r ($ arr1);
echo "nЕстенственная сортіровкаn";
usort ($ arr2, "strnatcmp");
print_r ($ arr2);

Даний скпріпт виведе наступне:

Звичайна сортіровкаArray (
\u003d\u003e Img1.png
\u003d\u003e Img10.png
\u003d\u003e Img12.png
\u003d\u003e Img2.png
)

Природна сортіровкаArray (
\u003d\u003e Img1.png
\u003d\u003e Img2.png
\u003d\u003e Img10.png
\u003d\u003e Img12.png
)

strnatcasecmp

Виробляє "природне" порівняння рядків без урахування регістру.
синтаксис:

Int strnatcasecmp (string str1, string str2)

Те ж, що і strnatcmp (), тільки ігнорує регістр.

similar_text

Виробляє визначення схожості двох рядків.
синтаксис:

Int similar_text (string firsrt, string second [, double percent])

Функція similar_text () обчислює схожість двох рядків по алгоритму, описаного Олівером (Oliver).
Але замість стека (як в псевдокоді Олівера) вона використовує рекурсивні виклики.
Складність алгоритму виконує функцію повільної, і її швидкість пропорційна (N ^ 3), де N - довжина найбільшої рядки.
Функція повертає число символів, які співпали в обох рядках. При передачі по посиланню третього необов'язкового параметра в ньому зберігається відсоток збігу рядків.

levenshtein

Визначення відмінності Левенштейна двох рядків.
синтаксис:

Int levenshtein (string str1, string str2)
int levenshtein (string str1, string str2, int cost_ins, int cost_rep, int cost_del)
int levenshtein (string str1, string str2, function cost)

"Різниця Левенштейна" - це мінімальне чило символів, яке потрібно було б замінити, вставити або видалити для того, щоб перетворити рядок str1 в str2. Складність алгоритму пропорційна добутку довжин рядків str1 і str2, що виконує функцію більш швидкодіючої, ніж similar_text ().

Перша форма функції повертає число необхідних операцій над символами рядків для трансформації str1 в str2.

Друга форма має три додаткові параметри: вартість операції вставки, заміни та видалення, що робить її більш адаптованою для обчислення, але при цьому менш швидкодіючої. Повертається інтегральний показник складності трансформації.
Третій варіант дозволяє вказати функцію, яка використовується для розрахунку складності трансформації.
Функція cost викликається з наступними аргументами:

застосовується операція (вставити, змінити, видалити): "I * quot ;," R "," D ";

фактичний символ першого рядка

фактичний символ другого рядка

позиція рядка 1

позиція рядка 2

що залишилася довжина рядка 1

що залишилася довжина рядка 2

Викликається, повинна буде повернути вартість цієї операції.
Якщо довжина однієї з рядків більше 255 символів, функція levenshtein () повертає -1,
але така довжина більш ніж достатня.

strcoll ()

Порівняння рядків з урахуванням поточної локалі (PHP 4\u003e \u003d 4.0.5, PHP 5)

опис:

Int strcoll (string str1, string str2)

Повертає позитивне число якщо str1 менше, ніж str2; негативне число якщо str1 більше, ніж str2, і 0 якщо рядки рівні. strcoll () при порівнянні використовує установки поточної локалі. Якщо встановлена \u200b\u200bлокаль C або POSIX, ця функція аналогічна strcmp ().

Зверніть увагу, що ця функція враховує регістр символів, і, на відміну від strcmp () небезпечна для обробки даних в двійковій формі.

PHP непогано орієнтований на обробку інформації. Синтаксис мови представлений повнофункціональним набором функцій порівняння, обробки рядків, операторами порівняння.

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

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

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

У разі контенкаціі число автоматом зливається з рядком без зайвих питань і ніяких прихованих помилок, навіть якщо функція gettype () дає "integer" або "double".

Однак є різниця між використанням функції is_int () і is_numeric (). Перша дає істину, коли параметр є тільки цілим числом, друга, коли будь-яким числом або числовий рядком (змінна має тип "string", але містить все, що передбачено математичної нотації).

Цей простий приклад - хороший зразок, як на PHP оператори порівняння рядків ( "\u003d\u003d", "\u003d\u003d\u003d", "! \u003d", ...) можуть подарувати безліч несподіванок. Змінні можуть змінювати свій тип, вони не завжди числа, але майже завжди їх можна привести до рядка. В крайньому випадку - це буде порожній рядок.

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

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

PHP-порівняння двох рядків добре "робить" функція strpos () - найдешевший, вірний і практичний варіант. Якщо функції число, то однозначно один рядок дорівнює інший або одна входить в іншу.

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

Якщо виклик функції $ cResult \u003d scCheckFileName ($ cStr) дасть "true", значить, рядок є ім'ям вордовского файлу. У нього буде тільки один варіант розширення ".docx" і ніяких символів в імені: тільки літери, цифри і знаки "_", "-".

Функція легко може бути перероблена на інші види файлів: $ cPtr \u003d "/^((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 \u003d implode ( ",", $ style-\u003e getInnerMargin ()); ... робота алгоритму / користувача ...; $ Margins2 \u003d implode ( ",", $ style-\u003e getInnerMargin ()) дозволяє злити всі позиції об'єкта в рядок позицій.

Потім можна виконати PHP-порівняння рядків і за один раз: $ check \u003d strcmp ($ margins1, $ margins2) і переконатися, що алгоритм або користувач щось змінив (чи ні). Якщо виконувати порівняння звичайним чином, то доведеться перебирати елементи масивів. Це відбувається довше і виглядає більш громіздко.

Об'єкти і рядки

Ще більш ефектне використання PHP (порівняння рядків) може бути реалізовано за допомогою об'єктно-орієнтованих ідей.

Сучасне уявлення про об'єкти передбачає наявність у них властивостей і методів. Перші зазвичай представлені числами, рядками, масивами та іншими об'єктами. Другі часто включають в себе методи запису (put) в рядок і відновлення з рядка (get).

На відміну від масивів, об'єкт виконує роботу зі своїми властивостями і взаємодіє з іншими об'єктами. Об'єкт "компетентний" в тому, які його властивості мають реальне значення для алгоритму, програми в цілому.

Цей момент дає підставу і можливість при запису фіксувати в рядок тільки потрібну інформацію, а при відновленні з рядка відновлювати все робочі властивості в потрібний стан. Зазвичай в будь-якому об'єкті є інформація істотна і робоча (тимчасова). Реалізація такої ідеї дозволяє економити не тільки пам'ять, дисковий простір, записи бази даних, але і робить можливим порівняння рядків простішими і точними засобами.

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

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

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

У цьому розділі пояснюються оператори порівняння. Ці оператори перевіряють рівність (таке як одно, менше, тотожно дорівнює і т.д.) між двома значеннями і повертають true або false залежно від того, як співвідносяться операнди. Оператори порівняння завжди повертають логічні значення, і ці значення найчастіше застосовуються в таких операторах як, while або for для управління ходом виконання програми.

Оператори порівняння
прикладНазварезультат
$ I \u003d\u003d $ yТак самоTRUE якщо $ i дорівнює $ y після перетворення типів даних.
$ I \u003d\u003d\u003d $ yідентичноTRUE якщо $ i дорівнює $ y і має той же тип даних.
$ I! \u003d $ YНе дорівнює
$ i<> $ yНе дорівнюєTRUE якщо $ i не дорівнює $ y після перетворення типів даних.
$ I! \u003d\u003d $ yЧи не ідентичноTRUE якщо $ i не дорівнює $ y або вони різних типів.
$ i< $y меншеTRUE якщо $ i строго менше $ y.
$ I\u003e $ yбільшеTRUE якщо $ i строго більше $ y.
$ i<= $y Менше або дорівнюєTRUE якщо $ i менше або дорівнює $ y.
$ I\u003e \u003d $ yБільше чи рівноTRUE якщо $ i більше або дорівнює $ y.

Примітка: якщо спробувати вивести результат операції порівняння на екран, значення true відобразиться у вікні браузера як 1. Значення false відповідає числу 0 і не відображається на екран (в принципі це ви повинні пам'ятати з опису типу boolean). Якщо ви хочете побачити результат у вигляді true або false використовуйте функцію var_dump ().

Так само варто відзначити: якщо порівнюється рядок з числом або два рядки, які містять числа, кожен рядок буде перетворена в число, і порівнюватися вони будуть як числа.

Оператор \u003d\u003d (рівності)

Оператор \u003d\u003d (рівності) приймає операнди будь-якого типу, якщо два операнда рівні, повертається значення true, в іншому випадку - false.

Якщо операнди мають різні типи даних, PHP спробує перетворити їх перед порівнянням до одного типу, наприклад такий вислів "4" \u003d\u003d 4 поверне значення true, так як PHP автоматично призведе порівнювані значення до одного типу даних. Аналогічно, вираз $ a \u003d\u003d 1 поверне значення true, якщо змінна $ a містить значення 1. Якщо потрібно уникнути неявного перетворення типів при порівнянні, то слід використовувати оператор ідентичності, який буде розглянуто далі.

Оператор \u003d\u003d\u003d (ідентичності)

Оператор \u003d\u003d\u003d (ідентичності) приймає операнди будь-якого типу і повертає true, якщо їх значення співпадають (рівні), і false, якщо вони різні. Чим же він відрізняється від оператора рівності? Оператор ідентичності перевіряє два операнда на «ідентичність», керуючись суворим визначенням збіги, це означає, що крім рівності самих значень операндів, вони також повинні належати до одного і того ж типу даних. Як приклад розглянемо такий вислів, як 5 \u003d\u003d\u003d "5", результатом цього виразу буде значення false, так як значення зліва є числом, а значення праворуч - рядком, тобто у цих значень різні типи даних. Запам'ятайте, що оператори \u003d\u003d і \u003d\u003d\u003d означають «дорівнює» і «ідентично / тотожно дорівнює».

Оператор! \u003d Або<> (Нерівності)

оператор нерівності має два види:! \u003d і<> . Він є протилежністю оператора \u003d\u003d і повертає true, в тому випадку, якщо значення операндів не рівні. Оператор нерівності повертає false тільки в тому випадку, якщо значення по обидва боки від нього рівні один одному.

$ Var2); // поверне false var_dump ( "Home"<> "Home"); // поверне true?\u003e

Оператор! \u003d\u003d (неидентичности)

Оператор! \u003d\u003d (неидентичности) виконує перевірку, в точності протилежну оператору \u003d\u003d\u003d. Він повертає true, якщо значення операндів не рівні один одному або не належати до одного і того ж типу даних. Як приклад розглянемо такий вираз: 7! \u003d\u003d "7", оператор «неидентичности» поверне true, тому що значення зліва є числом, а значення праворуч рядком, тобто вони відносяться до різних типів даних. Звідси легко буде запам'ятати, що оператори! \u003d І! \u003d\u003d означають «не дорівнює» і «не ідентичне / тотожне не дорівнює».

Оператор\u003e (більше)

При використанні оператора\u003e (більше) порівняння повертає true тільки в тому випадку, якщо значення зліва від оператора більше значення праворуч від нього. Як і інші оператори, оператор\u003e працює не тільки з числовими значеннями, а й із строковими. Але як один рядок може бути більша за іншу?

При роботі з рядками буква в нижньому регістрі більше літери у верхньому регістрі. При порівнянні рядків PHP спочатку перевіряє на розбіжність першу букву рядка. Якщо різниці не виявляється, відбувається перехід до наступного символу і т.д., поки не буде знайдено відмінність або не буде досягнутий кінець рядка. Якщо два значення з кожної зі сторін оператора\u003e дорівнюватимуть, оператор також поверне false.

3); // поверне true var_dump ( "Hi"\u003e "hi"); // поверне false var_dump (1\u003e 1); // поверне false?\u003e

оператор< (меньше)

оператор< (меньше ) является функциональной противоположностью оператора «больше». Он возвращает true , когда значение слева от него меньше значения, находящегося справа, и false , если значение левого операнда больше правого или значения равны.

Оператор\u003e \u003d (більше або дорівнює)

Оператор\u003e \u003d ( більше чи рівно) Трохи відрізняється від тих операторів порівняння, які розглядалися раніше. Він додає можливість рівності двох значень по обидва боки від нього, тобто, щоб було повернуто true, значення зліва від оператора повинно бути більше або дорівнює значенню праворуч від нього. Оператор «більше або дорівнює» повертає false, тільки якщо значення зліва від нього менше, ніж значення праворуч.

\u003d 5); // поверне true var_dump ( "hi"\u003e \u003d "hi"); // поверне true var_dump (1\u003e \u003d 2); // поверне false?\u003e

оператор<= (менше або дорівнює)

оператор<= (меньше или равно) похож на оператор «больше или равно». Чтобы оператор <= вернул true , значение слева от оператора должно быть меньше или равно значению справа от него. Он возвращает false , только если значение слева от него больше, чем значение справа.