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

Lekce 10 - Porovnávání textových řetězců v PHP

V této lekci kurzu PHP funkcí si ukážeme, jak porovnávat textové řetězce. Řetězce lze porovnávat pomocí různých algoritmů, které můžeme vymyslet, nebo využijeme některou z těchto funkcí pro porovnávání:

strcmp()

Funkce strcmp() slouží k porovnání dvou textových řetězců. Funkce je Binary-safe, tedy můžeme zde psát řetězce, které například obsahují českou diakritiku. Je také case-sensitive, tedy záleží na velkých a malých písmenech. Funkce přijímá 2 parametry, kterými jsou textové řetězce k porovnání. Výstupem této funkce je celé číslo (int). Výstupem může být také null, pokud je jedním z parametrů objekt nebo pole. Ukažme si příklad:

$strcmp = strcmp('Zdravím tě světe', 'Zdravím tě světe');
print_r($strcmp);

Zde jsou textové řetězce k porovnání totožné, výstupem funkce strcmp() je tedy 0.

$strcmp = strcmp('zdravím tě světe', 'Zdravím tě Světe');
print_r($strcmp);

U tohoto příkladu se textové řetězce liší pouze velkým písmenem, konkrétně u slova "Zdravím" a "Světe" ve druhém řetězci. První textový řetězec je tedy větší než ten druhý. Výstupem bude kladné číslo 1, které nám říká, že textové řetězce nejsou stejné a první řetězec je větší než druhý.

Další příklad:

$strcmp = strcmp('Zdravím tě Světe', 'zdravím tě světe');
print_r($strcmp);

Pokud řetězce pouze prohodíme, dostaneme záporné číslo -1. První textový řetězec je tedy menší než druhý.

$strcmp = strcmp('zdravím', 'zdravím světe');
print_r($strcmp);

Jestliže je první textový řetězec kratší, dostaneme záporné číslo -7 což je počet znaků, o kolik je kratší první textový řetězec. Můžeme si všimnout, že písmeno ě se berou jako dva znaky.

$strcmp = strcmp('zdravím světe', 'zdravím');
print_r($strcmp);

Pokud řetězce prohodíme a první textový řetězec je kratší, než ten druhý, dostaneme kladné číslo 7. Jak jsme si už asi odvodili, je to počet znaků, o kolik je první textový řetězec delší. Háčky a čárky nad písmeny se berou taktéž za dva znaky.

Funkce strcmp() je nám při porovnávání textových řetězců velmi nápomocná, avšak v některých případech jsou výsledky dosti zavádějící:

// 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()

Funkce strncmp() slouží k porovnání dvou textových řetězců do uvedené délky. Má tři parametry, první dva parametry jsou textové řetězce k porovnání, třetí parametr je délka porovnávání řetězců (do jaké délky se řetězce budou porovnávat). Funkce není Binary-safe co se týče délky porovnávání řetězců! Tedy pokud napíšeme textový řetězec s českou diakritikou, může být délka porovnávání řetězců (třetí parametr) nesprávná. strncmp() je také case-sensitive. Funkce je založena na podobným principu jako funkce strcmp(), ukažme si příklady:

$strncmp = strncmp('Zdravim svete', 'Zdravim svete', 7);
print_r($strncmp);

Výsledek tohoto příkladu je 0, jelikož je porovnáváno pouze prvních 7 znaků od začátku obou řetězců, zde tedy porovnáváme řetězce "Zdravim" a "Zdravim", které jsou naprosto totožné. Další příklad:

$strncmp = strncmp('Zdravim svete', 'Zdravim svete', -1);
print_r($strncmp);

Pokud zadáme délku k porovnávání menší než 0, dostaneme warning a funkce vrátí FALSE:

Tvoje stránka
localhost
$strncmp = strncmp('Zdravim svete', 'Zdravim svete', 100);
print_r($strncmp);

Zadáme-li značně větší délku k porovnávání, dostaneme stejný výsledek jako při porovnávání celých řetězců, v tomto případě jsou řetězce totožné, výstupem bude 0. Další příklad s třetím parametrem 0:

$strncmp = strncmp('Tyto řetězce', 'Nejsou totožné', 0);
print_r($strncmp);

Nezáleží na tom, zda jsou řetězce totožné nebo různé. Pokud budeme porovnávat 0 znaků, tak dostaneme, že jsou textové řetězce totožné. Výstupem tedy bude 0. Další příklad:

$strncmp = strncmp('zdravim svete', 'Zdravim Svete', 13);
print_r($strncmp);

Zde porovnáváme celé textové řetězce (oba mají délku 13 znaků). Stejně jako u předchozí funkce strcmp() se řetězce liší pouze velkým písmenem, konkrétně u slova "Zdravim" a "Svete" ve druhém řetězci. První textový řetězec je tedy jiný, než ten druhý. Výstupem bude kladné číslo 1.

$strncmp = strncmp('Zdravim svete', 'zdravim svete', 7);
print_r($strncmp);

Porovnáváme pouze prvních 7 znaků u obou řetězců, které nejsou totožné! První slova "Zdravim" a "zdravim" se liší velkým písmenem. První textový řetězec je tedy menší než druhý a výstupem bude -1.

$strncmp = strncmp('Zdravim', 'Zdravim Svete', 13);
print_r($strncmp);

Jestliže první textový řetězec je kratší, dostaneme záporné číslo -6, což je počet znaků, o kolik je kratší první textový řetězec.

Další příklady jsou podobné jako u funkce 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 další funkce pro porovnávání textových řetězců. Funkce je Binary-safe, tudíž podporuje českou diakritiku. Na rozdíl od funkce strcmp() a strncmp() je funkce strcasecmp() case-insensitive, tudíž nezáleží na velikosti písmen. Funkce přijímá 2 parametry, kterými jsou textové řetězce k porovnání. Výstupem této funkce je celé číslo (int). Výstupem může být také null, pokud je jedním z parametrů objekt nebo pole. Ukažme si příklad:

$strcasecmp = strcasecmp('Zdravím tě světe', 'Zdravím tě světe');
print_r($strcasecmp);

Zde jsou textové řetězce k porovnání totožné (i velikostí písmen), výstupem funkce strcasecmp() je tedy 0.

$strcasecmp= strcasecmp('Zdravím tě světe', 'zdravím tě Světe');
print_r($strcasecmp);

Výstupem funkce strcasecmp() je 0, tedy textové řetězce jsou totožné. Pokud se blíže podíváme na tyto řetězce, všimneme si, že velikost písmen je rozdílná. Další příklad:

$strcasecmp= strcasecmp('zdravím', 'zdravím světe');
print_r($strcasecmp);

Jestliže je první textový řetězec kratší, dostaneme záporné číslo -7 což je počet znaků, o kolik je kratší první textový řetězec.

$strcasecmp = strcasecmp('zdravím světe', 'zdravím');
print_r($strcasecmp);

Pokud řetězce prohodíme a první textový řetězec je kratší, než ten druhý, dostaneme kladné číslo 7 a to je počet znaků, o kolik je první textový řetězec delší.

Další příklady funkce 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()

Stejně jako funkce strncmp() přijímá tato funkce 3 parametry, kde první dva jsou textové řetězce a posledním parametrem je délka porovnávání řetězců (do jaké délky se řetězce budou porovnávat). Funkce není Binary-safe co se týče délky porovnávání řetězců! Stejně jako strcasecmp() je tato funkce case-insensitive. Ukažme si příklad:

$strncasecmp= strncasecmp('zdravim svete', 'Zdravim svete', 7);
print_r($strncasecmp);

Výsledkem je 0 jelikož je porovnáváno pouze prvních 7 znaků od začátku obou řetězců, zde tedy porovnáváme řetězce "zdravim" a "Zdravim" a jelikož funkce nerozlišuje velká a malá písmena, jsou naprosto totožné. Další příklad s třetím parametrem -1:

$strncasecmp= strncasecmp('Zdravim svete', 'zdravim svete', -1);
var_dump($strncasecmp);

Pokud zadáme délku k porovnávání menší než 0, dostaneme warning a funkce vrátí FALSE:

Tvoje stránka
localhost

Další příklad:

$strncasecmp= strncasecmp('Zdravim svete', 'zdravim te Svete', 100);
print_r($strncasecmp);

Zadáme-li značně větší délku k porovnávání, dostaneme stejný výsledek jako při porovnávání celých řetězců, v tomto případě jsou řetězce totožné, výstupem bude 0.

$strncasecmp= strncasecmp('Tyto retezce', 'Nejsou totozne', 0);
print_r($strncasecmp);

Nezáleží na tom, zda jsou řetězce totožné nebo různé. Pokud budeme porovnávat 0 znaků, tak dostaneme, že jsou textové řetězce totožné. Výstupem tedy bude 0.

$strncasecmp= strncasecmp('Zdravim', 'zdravim Svete', 13);
print_r($strncasecmp);

Jestliže první textový řetězec je kratší, dostaneme záporné číslo -7 což je počet znaků, o kolik je kratší první textový řetězec.

Další příklady funkce 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

Tyto funkce jsou tedy velmi podobné a liší se pouze maličkostmi.

V další lekci, Porovnávání textových řetězců v PHP II. část, si ukážeme další funkce pro porovnávání textových řetězců v PHP.


 

Předchozí článek
Kvíz - Vlastnosti, tagy a nahrazování řetězců v PHP
Všechny články v sekci
PHP funkce
Přeskočit článek
(nedoporučujeme)
Porovnávání textových řetězců v PHP II. část
Článek pro vás napsal Pavel Vaněček
Avatar
Uživatelské hodnocení:
6 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity