Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

11. diel - Porovnávanie textových reťazcov v PHP II. časť

V minulej lekcii, Porovnávanie textových reťazcov v PHP , sme sa dozvedeli, ako porovnávať textové reťazce v PHP.

V tomto diele funkcií v PHP na porovnávanie textových reťazcov si vysvetlíme užitočné funkcie na porovnávanie. Niektoré funkcie sú síce menej známe, avšak je dobré sa s nimi zoznámiť:)

strnatcmp()

Je funkcia podobná funkcii strcmp(), o ktorej sme sa bavili v predchádzajúcom diele. Funkcia strnatcmp() porovná dva textové reťazce. Ak je prvý textový reťazec menšia ako druhý, vráti hodnotu menšiu ako 0. Hodnotu väčšiu ako 0 vracia v prípade, keď je prvý reťazec väčší ako druhý. Ak sú obaja reťazca identické, funkcia vráti 0. Funkcia porovnáva textové reťazce pomocou tzv. Prirodzeného algoritmu (Natural algorithm). V prirodzenom algoritmu porovnávania je napríklad číslo 5 menšie ako číslo 10, čo celkom iste vieme a nemusíme to dokazovať. V počítačovom radiacim algoritmu (computer sorting) sú pravidlá pre radenie trochu odlišná, napríklad číslo 3 by bolo v tomto algoritme radenie väčšie ako číslo 20. je tomu tak, pretože sú porovnávaná prvé začiatočné čísla (resp. 3 a 2 0). Funkcia strnatcmp() je case-sensitive teda záleží na veľkých a malých písmenách. Funkcia prijíma 2 parametre, ktorými sú textové reťazce k porovnanie:

$strnatcmp = strnatcmp('5', '10');
print_r($strnatcmp);

Tu porovnávame čísla zapísaná v textových reťazcoch. Keďže je prvý reťazec menšia ako ten druhý, výstupom na stránku pomocou funkcie pre výpis print_r() bude -1. Funkcia strnatcmp() dokáže tiež porovnávať desatinné čísla zapísané ako textový reťazec:

$strnatcmp = strnatcmp('50', '49.999');
print_r($strnatcmp);

Výstupom na stránku bude číslo 1, keďže prvý reťazec je väčší ako ten druhý. Ďalší príklad:

$strnatcmp = strnatcmp('Stejný text', 'Stejný text');
print_r($strnatcmp);

Ak sú zadané textové reťazce totožné aj veľkosťami znakov, funkcia vráti 0:

$strnatcmp = strnatcmp('stejný text', 'Stejný text');
print_r($strnatcmp);

Avšak zmeníme Ak veľkosti znakov, dostaneme hodnotu v závislosti na veľkosti reťazcov, v tomto prípade dostaneme číslo 1, teda prvý textový reťazec je väčší ako ten druhý. Písmeno s má totiž v ASCII tabuľke väčšiu hodnotu ako písmeno S.

$strnatcmp = strnatcmp('Alexandr', 'Božena');
print_r($strnatcmp);

V tomto prípade vráti funkcie hodnotu -1, pretože oba textové reťazce sú odlišné a prvý znak v prvom reťazci je menšia ako znak v druhom reťazci.

similar_text()

Funkcia similar_text() porovná dva textové reťazce a vypočíta ich podobnosť (Similarity) na počet znakov s možnosťou prepočtu na percentá. Táto funkcia je oproti funkciu levenshtein(), ktorú si ukážeme ďalej, pomalá, jej časová komplexita je O (N 3). Avšak ponúkne nám oveľa presnejší výsledok s malým množstvom nutných úprav pre jej implementáciu. Funkcia vracia počet zhodných znakov oboch textových reťazcov. Funkcia similar_text() je case-sensitive. Funkcia prijíma 3 parametre, kde prvý dva sú textové reťazce k porovnaniu a posledným parametrom je percentuálne vyjadrenie podobnosti oboch reťazcov. Ukážme si príklady:

$similar_text = similar_text('Pavel', 'Pavlína');
print_r($similar_text);

Funkcia vráti počet zhodných znakov, avšak nezáleží na poradí. Výstupom funkcie bude číslo 4, pretože práve 4 znaky v oboch reťazcoch sú zhodné. Ide o znaky P, a, v, a l. Ďalší príklad:

$similar_text = similar_text('Allljaska', 'Aljaska');
print_r($similar_text);

Aj napriek tomu, že v prvom textovom reťazci máme viac rovnakých znakov, než v reťazci druhom, je výstupom funkcia číslo 7. Teda počet zhodných znakov v oboch reťazcoch. Ak sa nám opakuje jeden znak viackrát, bude započítaný iba raz (prvý výskyt).

$similar_text = similar_text('', '', $procenta);
printf("Počet stejných znaků: %d <br/> Procentuálně: %f%%", $similar_text, $procenta);

Ak si chceme vyjadriť Similarity percentuálne u oboch reťazcov, vložíme novú premennú (s názvom napr. $procenta) do tretieho parametra funkcie. Ak máme obaja textové reťazce vo funkcii prázdne, dostaneme znakovú podobnosť 0, percentuálne teda 0%.

Používanie tejto funkcie môže vyvolať tiež neočakávaný výsledok! Ak by sme prehodili poradie reťazcov, teda prvý reťazec namiesto druhého, dostaneme úplne odlišný výstup funkcie. Príklad:

$prvni = "bafoobar";
$druhy = "barfoo";

$similar_text = similar_text($prvni, $druhy);
print_r($similar_text);

$similar_text_2 = similar_text($druhy, $prvni);
print_r($similar_text_2);

V prvom výpise dostaneme znakovú podobnosť 5, teda presne päť znakov je zhodných. V druhom prípade dostaneme podobnosť 3, čo nezodpovedá počtu zhodných znakov oboch reťazcov!

levenshtein()

Funkcia levenshtein() slúži na porovnávanie dvoch textových reťazcov a vypočíta ich odlišnú dištanc, teda hodnotu, o koľko znakov sa líšia. Funkcia prijíma celkom 5 parametrov, kde prvé dva sú textové reťazce k porovnanie. Tretím, štvrtým a piatym parametrom je číslo, o koľko sa bude zväčšovať dištancie v prípade znaku v reťazci navyše, výmenou znaku a odstránením znaku (defaultný hodnota 1). Ak sa stane, že jeden z reťazcov presiahne dĺžku znakov 255, je výstupom funkcia hodnota -1. Časová komplexita je O (m × n), čo je oproti funkciu similar_text() znateľne lepšia. Ukážme si príklady:

$levenshtein = levenshtein('Text', 'text');
print_r($levenshtein);

Výstupom funkcie je hodnota 1, teda presne o 1 znak je prvý alebo druhý textový reťazec rozdielny. Ďalší príklad:

$levenshtein = levenshtein('Text', 'Text');
print_r($levenshtein);

Tu je návratová hodnota funkcie rovná 0. To znamená, že obaja reťazce sú si rovné. Ešte jeden príklad:

$levenshtein = levenshtein('Ada Lovelace', 'Lovelace', 10, 15, 20);
print_r($levenshtein);

Ak uvedieme tretí, štvrtý a piaty parameter, upravíme tým počítanie rozdielov textových reťazcov. V tomto prípade je počet chýbajúcich znakov v porovnaní oboch reťazcov celkom 4. Avšak výstupom funkcia bude číslo 80 (4 × 20), keďže posledným parametrom upravujeme hodnotu pre chýbajúce (odstránenej) znaky, ak chcete "cenu za chýbajúce znak".

strcoll()

Funkcia porovná dva textové reťazce rovnako ako predchádzajúce funkcie. Funkcia strcoll() porovná dva textové reťazce a ak je prvý textový reťazec menšia ako druhý, vráti hodnotu menšiu ako 0. Hodnotu väčšiu ako 0 vracia v prípade, keď je prvý reťazec väčší ako druhý. Ak sú obaja reťazca identické, funkcia vráti 0. Funkcia je case-sensitive a nie binary-safe. Návratová hodnota funkcie je ovplyvnená nastavenú lokácií (znak (A) <(a) alebo (A)> (a)). Ukážme si nejaké príklady:

$strcoll = strcoll('Edward Brown', 'Edwin Brown');
print_r($strcoll);

Funkcia vráti hodnotu -1, pretože je prvý reťazec menšia ako ten druhý. Ďalší príklad:

$strcoll = strcoll('brown', 'Brown');
print_r($strcoll);

Funkcia vráti hodnotu 1, pretože je prvý reťazec väčší ako ten druhý. Čiže, b < B. Keď zadáme rovnaké reťazca:

$strcoll = strcoll('Edward', 'Edward');
print_r($strcoll);

funkcia vráti hodnotu 0. To taktiež platí u porovnávanie dvoch prázdnych textových reťazcov:

$strcoll = strcoll('', '');
print_r($strcoll);

To by pre dnešok ohľadom funkcií na porovnávanie reťazcov stačilo:)

V ďalšej lekcii, Vyhľadávania textových reťazcov v PHP , si ukážeme funkcie pre vyhľadávanie textových reťazcov.


 

Predchádzajúci článok
Porovnávanie textových reťazcov v PHP
Všetky články v sekcii
PHP funkcie
Preskočiť článok
(neodporúčame)
Vyhľadávania textových reťazcov v PHP
Článok pre vás napísal Pavel Vaněček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity