10. diel - Porovnávanie textových reťazcov v PHP
V minulej lekcii, Malé a veľké písmená v textovom reťazci , sme sa dozvedeli, ako v textových reťazcoch meniť veľkosť písmen.
V tejto lekcii kurze PHP funkcií si ukážeme, ako porovnávať textové reťazce. Reťazce možno porovnávať pomocou rôznych algoritmov, ktoré môžeme vymyslieť, alebo využijeme niektorú z týchto funkcií na porovnávanie:
strcmp()
Funkcia strcmp()
slúži na porovnanie dvoch textových
reťazcov. Funkcia je Binary-safe, teda môžeme tu písať
reťazca, ktoré napríklad obsahujú slovenskú diakritiku. Je tiež
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. Výstupom tejto funkcie je celé číslo (int).
Výstupom môže byť tiež null, ak jedným z parametrov
objekt alebo pole. Ukážme si príklad:
$strcmp = strcmp('Zdravím tě světe', 'Zdravím tě světe'); print_r($strcmp);
Tu sú textové reťazce k porovnaniu totožné, výstupom funkcie
strcmp()
je teda 0.
$strcmp = strcmp('zdravím tě světe', 'Zdravím tě Světe'); print_r($strcmp);
Pri tomto príklade sa textové reťazce líšia iba veľkým písmenom, konkrétne u slová "Zdravím" a "Svete" v druhom reťazci. Prvý textový reťazec je teda väčší ako ten druhý. Výstupom bude kladné číslo 1, ktoré nám hovorí, že textové reťazce nie sú rovnaké a prvý reťazec je väčší ako druhý.
Ďalší príklad:
$strcmp = strcmp('Zdravím tě Světe', 'zdravím tě světe'); print_r($strcmp);
Ak reťazca iba prehodíme, dostaneme záporné číslo -1. Prvý textový reťazec je teda menšia ako druhý.
$strcmp = strcmp('zdravím', 'zdravím světe'); print_r($strcmp);
Ak je prvý textový reťazec kratšie, dostaneme záporné číslo
-7 čo je počet znakov, o koľko je kratšia prvý textový reťazec.
Môžeme si všimnúť, že písmeno ě
sa berú ako dva znaky.
$strcmp = strcmp('zdravím světe', 'zdravím'); print_r($strcmp);
Ak reťazca prehodíme a prvý textový reťazec je kratší, než ten druhý, dostaneme kladné číslo 7. Ako sme si už asi odvodili, je to počet znakov, o koľko je prvý textový reťazec dlhší. Háčiky a čiarky nad písmenami sa berú taktiež za dva znaky.
Funkcia strcmp()
je nám pri porovnávaní textových reťazcov
veľmi nápomocná, avšak v niektorých prípadoch sú výsledky dosť
zavádzajúce:
// funkce: // výstup: print_r(strcmp('Ahoj Světe', null)); // 1 print_r(strcmp('Ahoj Světe', false)); // 11 print_r(strcmp(false, 'Ahoj Světe')); // -11 print_r(strcmp(array('ahoj', 'světe'), 'Ahoj Světe')); // Vyvolá warning a vrátí NULL print_r(strcmp('Ahoj Světe', 0)); // 1 print_r(strcmp(0, 'ahoj světe')); // -1 print_r(strcmp(false, 0)); // -1 print_r(strcmp(0, -1)); // 1 print_r(strcmp(0, 1)); // -1 print_r(strcmp(300, 200)); // 1
strncmp()
Funkcia strncmp()
slúži na porovnanie dvoch textových
reťazcov do uvedenej dĺžky. Má tri parametre, prvé dva parametre sú
textové reťazce na porovnanie, tretí parameter je dĺžka porovnávanie
reťazcov (do akej dĺžky sa reťazca budú porovnávať). Funkcia nie
je Binary-safe čo sa týka dĺžky porovnávanie reťazcov! Teda ak
napíšeme textový reťazec s českou diakritikou, môže byť dĺžka
porovnávanie reťazcov (tretí parameter) nesprávna. strncmp()
je
tiež case-sensitive. Funkcia je založená na podobným
princípe ako funkcia strcmp()
, ukážme si príklady:
$strncmp = strncmp('Zdravim svete', 'Zdravim svete', 7); print_r($strncmp);
Výsledok tohto príkladu je 0, keďže je porovnávané iba prvých 7 znakov od začiatku oboch reťazcov, tu teda porovnávame reťazce "Zdravim" a "Zdravim", ktoré sú úplne totožné. Ďalší príklad:
$strncmp = strncmp('Zdravim svete', 'Zdravim svete', -1); print_r($strncmp);
Pokiaľ zadáme dĺžku k porovnávaniu menšia ako 0, dostaneme warning a funkcie vráti FALSE:
$strncmp = strncmp('Zdravim svete', 'Zdravim svete', 100); print_r($strncmp);
Ak zadáme značne väčšiu dĺžku k porovnávaniu, dostaneme rovnaký
výsledok ako pri porovnávaní celých reťazcov, v tomto prípade sú reťazce
totožné, výstupom bude 0. Ďalší príklad s tretím
parametrom 0
:
$strncmp = strncmp('Tyto řetězce', 'Nejsou totožné', 0); print_r($strncmp);
Nezáleží na tom, či sú reťazce totožné alebo rôzne. Ak budeme porovnávať 0 znakov, tak dostaneme, že sú textové reťazce totožné. Výstupom teda bude 0. Ďalší príklad:
$strncmp = strncmp('zdravim svete', 'Zdravim Svete', 13); print_r($strncmp);
Tu porovnávame celé textové reťazce (obaja majú dĺžku 13 znakov).
Rovnako ako u predchádzajúcej funkcie strcmp()
sa reťazca
líšia iba veľkým písmenom, konkrétne u slová "Zdravim" a
"Svete" v druhom reťazci. Prvý textový reťazec je teda
iný, než ten druhý. Výstupom bude kladné číslo 1.
$strncmp = strncmp('Zdravim svete', 'zdravim svete', 7); print_r($strncmp);
Porovnávame iba prvých 7 znakov u oboch reťazcov, ktoré nie sú totožné! Prvé slová "Zdravim" a "zdravim" sa líši veľkým písmenom. Prvý textový reťazec je teda menšia ako druhý a výstupom bude -1.
$strncmp = strncmp('Zdravim', 'Zdravim Svete', 13); print_r($strncmp);
Ak prvé textový reťazec je kratší, dostaneme záporné číslo -6, čo je počet znakov, o koľko je kratšia prvý textový reťazec.
Ďalšie príklady sú podobné ako pri funkcii strcmp()
:
print_r(strncmp(array('ahoj', 'svete'), 'ahoj svete', 4)); // Vyvolá warning a vrátí null print_r(strncmp(100, 300, 1)); // -1 print_r(strncmp(100, 300, 5)); // -1
strcasecmp()
Je ďalšie funkcie pre porovnávanie textových reťazcov. Funkcia je
Binary-safe, teda podporuje slovenskú diakritiku. Na rozdiel
od funkcie strcmp()
a strncmp()
je funkcia
strcasecmp()
case-sensitive, teda nezáleží na
veľkosti písmen. Funkcia prijíma 2 parametre, ktorými sú textové reťazce
k porovnanie. Výstupom tejto funkcie je celé číslo (int).
Výstupom môže byť tiež null, ak jedným z parametrov
objekt alebo pole. Ukážme si príklad:
$strcasecmp = strcasecmp('Zdravím tě světe', 'Zdravím tě světe'); print_r($strcasecmp);
Tu sú textové reťazce k porovnaniu totožné (i veľkosťou písmen), výstupom funkcie strcasecmp () je teda 0.
$strcasecmp= strcasecmp('Zdravím tě světe', 'zdravím tě Světe'); print_r($strcasecmp);
Výstupom funkcie strcasecmp()
je 0, teda
textové reťazce sú totožné. Ak sa bližšie pozrieme na tieto reťazce,
všimneme si, že veľkosť písmen je rozdielna. Ďalší príklad:
$strcasecmp= strcasecmp('zdravím', 'zdravím světe'); print_r($strcasecmp);
Ak je prvý textový reťazec kratšie, dostaneme záporné číslo -7 čo je počet znakov, o koľko je kratšia prvý textový reťazec.
$strcasecmp = strcasecmp('zdravím světe', 'zdravím'); print_r($strcasecmp);
Ak reťazca prehodíme a prvý textový reťazec je kratší, než ten druhý, dostaneme kladné číslo 7 a to je počet znakov, o koľko je prvý textový reťazec dlhší.
Ďalšie príklady funkcie strcasecmp()
:
print_r(strcasecmp('Ahoj Světe', null)); // 11 print_r(strcasecmp('Ahoj Světe', false)); // 11 print_r(strcasecmp(false, 'Ahoj Světe')); // -11 print_r(strcasecmp(array('ahoj', 'světe'), 'Ahoj Světe')); // Vyvolá warning a vrátí NULL print_r(strcasecmp('Ahoj Světe', 0)); // 49 print_r(strcasecmp(0, 'ahoj světe')); // -49 print_r(strcasecmp(false, 0)); // -1 print_r(strcasecmp(0, -1)); // 3 print_r(strcasecmp(0, 1)); // -1 print_r(strcasecmp(300, 200)); // 1
strncasecmp()
Rovnako ako funkcia strncmp()
prijíma táto funkcia 3
parametre, kde prvý dva sú textové reťazce a posledným parametrom je
dĺžka porovnávanie reťazcov (do akej dĺžky sa reťazca budú
porovnávať). Funkcia nie je Binary-safe čo sa týka dĺžky
porovnávanie reťazcov! Rovnako ako strcasecmp()
je táto funkcia
case-insensitive. Ukážme si príklad:
$strncasecmp= strncasecmp('zdravim svete', 'Zdravim svete', 7); print_r($strncasecmp);
Výsledkom je 0 keďže je porovnávané iba prvých 7
znakov od začiatku oboch reťazcov, tu teda porovnávame reťazce
"zdravim" a "Zdravim" a keďže funkcie
nerozlišuje veľké a malé písmená, sú úplne totožné. Ďalší príklad
s tretím parametrom -1
:
$strncasecmp= strncasecmp('Zdravim svete', 'zdravim svete', -1); var_dump($strncasecmp);
Pokiaľ zadáme dĺžku k porovnávaniu menšia ako 0, dostaneme warning a funkcie vráti FALSE:
Ďalší príklad:
$strncasecmp= strncasecmp('Zdravim svete', 'zdravim te Svete', 100); print_r($strncasecmp);
Ak zadáme značne väčšiu dĺžku k porovnávaniu, dostaneme rovnaký výsledok ako pri porovnávaní celých reťazcov, v tomto prípade sú reťazce totožné, výstupom bude 0.
$strncasecmp= strncasecmp('Tyto retezce', 'Nejsou totozne', 0); print_r($strncasecmp);
Nezáleží na tom, či sú reťazce totožné alebo rôzne. Ak budeme porovnávať 0 znakov, tak dostaneme, že sú textové reťazce totožné. Výstupom teda bude 0.
$strncasecmp= strncasecmp('Zdravim', 'zdravim Svete', 13); print_r($strncasecmp);
Ak prvé textový reťazec je kratší, dostaneme záporné číslo -7 čo je počet znakov, o koľko je kratšia prvý textový reťazec.
Ďalšie príklady funkcie strncasecmp()
:
print_r(strncasecmp(array('ahoj', 'svete'), 'ahoj svete', 4)); // Vyvolá warning a vrátí FALSE print_r(strncasecmp(100, 300, 1)); // -2 print_r(strncasecmp(100, 300, 5)); // -2
Tieto funkcie sú teda veľmi podobné a líšia sa len maličkosťami.
V nasledujúcom kvíze, Kvíz - Vlastnosti, tagy a nahrádzanie reťazcov v PHP, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.