Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PI_lektsii_2016.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
6.12 Mб
Скачать

12.9 Функции сравнения строк (strcmp(), strncmp(), strcasecmp(), strncasecmp(), strnatcmp(), strnatcasecmp(), similar_text(), levenshtein())

12.9.1 strcmp()

Синтаксис:

int strcmp (string str1, string str2)

Ця функція порівняння рядків. Вона порівнює два рядки і повертає:

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

  2. 1 – якщо, рядок str1 лексикографічно більше str2;

  3. -1 –якщо, навпаки, рядок str1 лексикографічно менше str2

Функція є чутливою до регістру, тобто регістр символів впливає на результати порівнянь (оскільки порівняння відбувається побайтово). Приклад:

<?

   $ Str1 = "ttt";

   $ Str2 = "tttttttttt";

   echo ( "Result of strcmp ($ str1, $ str2) is");

   echo (strcmp (str1, str2)); echo ( "<br>");

   echo ( "Result of strcmp ($ str2, $ str1)> is");

   echo (strcmp (str2, str1)); echo ( "<br>");

   echo ( "Result of strcmp ($ str1, $ str1) is");

   echo (strcmp (str1, str1));

?>

Результат:

Result of strcmp (ttt, tttttttttt) is -1

Result of strcmp (tttttttttt, ttt) is 1

Result of strcmp (ttt, ttt) is 0

12.9.2 strncmp ()

Синтаксис:

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

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

В іншому функція поводиться аналогічно strcmp (), тобто повертає:

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

  2. 1 – якщо, рядок str1 лексикографічно більше str2;

  3. -1 – якщо, навпаки, рядок str1 лексикографічно менше str2.

Порівняння також проводиться побайтово, тому функція чутлива до регістру.

12.9.3 strcasecmp ()

Синтаксис:

int strcasecmp (string str1, string str2)

Функція працює аналогічно strcmp (), тільки при роботі не враховується регістр букв.

12.9.4 strncasecmp ()

Синтаксис:

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

Функція strncasecmp () порівнює початок рядків без урахування регістру.

12.9.5 strnatcmp ()

Синтаксис:

int strnatcmp (string str1, string str2)

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

Тобто, якщо, наприклад, ми будемо порівнювати файли з назвами pict1.gif, pict20.gif, pict2.gif, pict10.gif, то звичайне порівняння призведе до наступного їх розташуванню: pict1.gif, pict10.gif, pict2 .gif, pict20.gif. Природна ж сортування дасть результат, який нам більш звичний: pict1.gif, pict2.gif, pict10.gif, pict20.gif.

У прикладі використання цієї функції ми знову вдамося до функцій роботи з массивами:

<?

    $ Array1 = $ array2 = array ("pict10.gif", "pict2.gif", "pict20.gif", "pict1.gif");

    echo ("звичайне сортування:"); echo ("<br>");

    usort ($ array1, strcmp);

    print_r ($ array1);

    echo ("<br>"); echo ("природне сортування:"); echo ("<br>");

    usort ($ array2, strnatcmp);

    print_r ($ array2);

?>

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

Звичайне сортування:

Array ([0] => pict1.gif [1] => pict10.gif [2] => pict2.gif [3] pict20.gif)

Природне сортування:

Array ([0] => pict1.gif [1] => pict2.gif [2] => pict10.gif [3] pict20.gif)

12.9.6 strnatcasecmp ()

Синтаксис:

int strnatcasecmp (string str1, string str2)

Виробляє "природне" порівняння рядків без урахування регістру. Функція виконує те ж саме, що і strnatcmp (), тільки без урахування регістру.

12.9.7 similar_text ()

Синтаксис:

int similar_text (string str_first, string str_second [, double percent])

Ця функція виконує визначення схожості двох рядків. Функція similar_text () визначає схожість двох рядків по алгоритму Олівера. Функція повертає число символів, що збіглися в рядках str_first і str_second. Третій необов'язковий параметр передається по посиланню і в ньому зберігається відсоток збігу рядків.

Замість стека, як в алгоритмі Олівера, ця функція використовує рекурсивні виклики. Складність алгоритму цієї функції дорівнює O ((max (n, m)) 3), що робить цю функцію повільною. (Грубо кажучи, швидкість виконання цієї функції пропорційна N3, де N - довжина найбільшого рядка.

Приклад:

<?

   $ Str1 = "Hello, world!";

   $ Str2 = "Hello!";

   $ Var = similar_text ($ str1, $ str2);

   $ Var1 = similar_text ($ str1, $ str2, & $ tmp);

   // Параметр $ tmp передаємо по посиланню

   echo ( "Результат виконання функції similar_text ()

   для рядків $ str і $ str1 в кількості символів: ");

   echo ( "<br>"); echo ( "$ var"); echo ( "<br>");

   echo ( "і в процентах:"); echo ( "<br>");

   echo ($ tmp); // Для виведення інформації в процентах звертаємося до $ tmp

?>

  Результат виконання функції similar_text () для рядків Hello, world! і Hello! в кількості символів:

6

і у відсотках:

63.157894736842

12.9.8 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.

Складність алгоритму цієї функції дорівнює O (m * n), тобто пропорційна добутку довжин рядків str1 і str2, тому ця функція набагато швидша, ніж функція similar_text ().

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

<?

   $ Str1 = "Hello, world!";

   $ Str2 = "Hello!";

   $ Var = levenshtein ($ str1, $ str2);

   echo ($ var); // Поверне 7

?>

У другому випадку додаються три додаткові параметри: вартість операції вставки cost_ins, заміни cost_rep і видалення cost_del. Природно, функція в цьому

випадку стає менш швидкодіючої. Повертається інтегральний показник складності трансформації (ІПСТ).

<?

   $ Str1 = "Hello, world!";

   $ Str2 = "Hello!";

   $ Var = levenshtein ($ str1, $ str2,3,3,3);

   echo ($ var); // Поверне 21

?>

Число 21, між іншим, це 7 * 3 :). Тобто ІПСТ дорівнює добутку кількості символів, необхідних для заміни (а як ми порахували в попередньому прикладі їх треба 7) на вартість, в цьому випадку, однією з операцій.

У цьому прикладі, оскільки вартість однакова, не має значення, яку операцію брати. У разі, якщо вартості різні, при обчислення ІПСТ береться найбільший. Тобто, якщо ми напишемо в цьому прикладі

$ Var = levenshtein ($ str1, str2, 2,3,6);

то функція поверне нам значення 42.

Третій варіант дозволяє вказати функцію, яка використовується для розрахунку складності трансформації.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]