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

V minulé lekci, Malá a velká písmena v textovém řetězci, jsme se dozvěděli, jak v textových řetězcích měnit velikost písmen.

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);
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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

Your page
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-sensitive, 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:

Your page
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.


 

Předchozí článek
Malá a velká písmena v textovém řetězci
Všechny články v sekci
PHP funkce
Článek pro vás napsal Pavel Vaněček
Avatar
Jak se ti líbí článek?
1 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity (2)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!