Lekce 10 - Porovnávání textových řetězců v PHP
V předchozím kvízu, Kvíz - Vlastnosti, tagy a nahrazování řetězců v PHP, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
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:
$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:
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.