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.