IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

Tvoja stránka
localhost
$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:

Tvoja stránka
localhost

Ď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í.


 

Predchádzajúci článok
Malé a veľké písmená v textovom reťazci
Všetky články v sekcii
PHP funkcie
Preskočiť článok
(neodporúčame)
Kvíz - Vlastnosti, tagy a nahrádzanie 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