IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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 3 - Rozdělování a spojování textových řetězců

V předchozí lekci, PHP funkce pro výpis textových řetězců, jsme si vysvětlili jednotlivé PHP funkce pro výpis textových řetězců, formátování textu a práci s argumenty.

V této lekci kurzu PHP funkcí si vyjmenujeme a detailně popíšeme funkce pro rozdělování a spojování textových řetězců, které je dobré pro jejich práci znát.

Rozdělování a spojování textových řetězců

Jak je nám jistě známo, s textovými řetězci můžeme pracovat tak, jak se nám zlíbí. Doposud jsme textové řetězce jen vypisovali, nyní si ale ukážeme příklady funkcí v PHP, které se zaslouží o rozdělování a spojování textových řetězců.

explode()

Tato funkce nám textový řetězec rozdělí do jednotlivých prvků v poli pomocí námi vybraného rozdělovacího znaku, tzv. delimitéru. Příklad použití funkce explode():

$text = "Příklad funkce explode";
$rozdeleny_text = explode(" ",$text); // Rozdělujeme text pomocí mezery
print_r($rozdeleny_text);

Textový řetězec je rozdělen do tří prvků pole podle oddělovače " ", což nám představuje mezeru. Tedy při každé mezeře dojde k rozdělení textového řetězce do prvků v poli takto:

Array ( [0] => Příklad [1] => funkce [2] => explode )

Nyní použijeme zcela jiný znak pro rozdělování textového řetězce:

$text = "Její jméno bylo: Anna";
$rozdeleny_text = explode(":",$text); // Delimitér ':'
print_r($rozdeleny_text);

Textový řetězec je tedy rozdělen pomocí delimitéru : na dva prvky v poli:

Array ( [0] => Její jméno bylo [1] => Anna )

Můžeme si všimnout, že dvojtečka (delimitér) není součástí pole, tak jako delimiter mezer na příkladu výše.

Ve funkci explode() lze také limitovat počet prvků v poli:

$text = "Toto je delší text";
$rozdeleny_text = explode(" ",$text, 2); // Limit počtu prvků v poli je nastaven na 2
print_r($rozdeleny_text);

Pokud dosáhneme limitu počtu prvků pole, rozdělování zbytku řetězce se neprovede a zbytek textu je vypsán do posledního prvku v poli:

Array ( [0] => Toto [1] => je delší text )

Kromě limitu počtu prvků v poli pomocí celých kladných čísel zde existuje varianta od verze PHP 5.1 limitování pomocí negativních (záporných) čísel:

$text = "Tento text bude uřízlý";
$rozdeleny_text = explode(" ",$text, -1); // Limit počtu prvků v poli zmenšený o 1
print_r($rozdeleny_text);

Limitováním pomocí záporných čísel text uřízneme, v našem případě o jeden prvek. Přijdeme tedy o část textového řetězce v závislosti na dělení textu pomocí delimitéru. Textový řetězec se do prvků pole neuloží celý:

Array ( [0] => Tento [1] => text [2] => bude )

Pokud se budeme snažit rozdělit textový řetězec, ve kterém se nebude nacházet zadaný delimitér, bude celý text umístěný do prvního prvku [0] v poli:

$text = "Tato věta nemá zadaný delimitér";
$rozdeleny_text = explode(",",$text); // Delimitér ','
print_r($rozdeleny_text);

Prvek pole bude tedy pouze jeden:

Array ( [0] => Tato věta nemá zadaný delimitér )

implode()

Je vlastně opačnou funkcí k funkci explode(). Části textu jsou zapsány jako hodnoty v jednotlivých prvků pole a jsou spojovány pomocí speciálních znaků, tzv. lepidla (glue).

Zde si spojíme textové prvky pole pomocí znaku ,:

$textove_pole = array('jablka', 'hrušky', 'švestky');
$spojeny_text = implode(",", $textove_pole); // Spojení prvků pole pomocí znaku ','
echo ($spojeny_text);

Na stránce uvidíme:

Funkce implode()
localhost

Jestliže si pojmenujeme klíče prvků pole, text bude spojen bez ohledu na název klíčů:

$textove_pole = array('prvni' => 'kniha', 'auto', 'treti' => 'počítač');
$spojeny_text = implode(',', $textove_pole);
echo ($spojeny_text);

Výsledkem bude:

Funkce implode()
localhost

Více praktické použití funkce implode() si můžeme ukázat, pokud chceme například sestavit list pomocí HTML znaků:

$cisla = array('1', '2', '3', '4', '5');
echo "<ul><li>" .implode("</li><li>", $cisla). "</li></ul>";

Pomocí slučování textových řetězců na stránce uvidíme:

Funkce implode()
localhost

Pokud se budeme snažit spojovat prázdné pole, výsledkem bude prázdný řetězec.

join()

Je aliasem funkce implode() a vlastně dělá to samé:

$textove_pole = array( 'prvni' => 'telefon', 'tablet', 'treti' => 'klávesnice' );
$spojeny_text = join(',', $textove_pole);
echo ($spojeny_text);

Výstupem je:

Funkce implode()
localhost

Avšak z důvodu přehlednosti a působivosti kódu programátoři používají funkci implode() s její opačnou funkcí explode(). Na druhou stranu, funkci join() najdeme ve většině programovacích jazyků. Je tedy známější.

str_split()

Je funkce, která rozdělí textový řetězec na jednotlivé textové úseky podle zadané délky úseku. Defaultní hodnotou je délka úseku 1, tedy textový řetězec bude rozdělen na jednotlivé znaky a každý znak bude představovat hodnotu prvku v poli:

$text = "Ahoj";
print_r(str_split($text)); // Rozdělení textového řetězce do prvků pole po znacích

Výsledkem je pole o čtyřech prvcích:

Array ( [0] => A [1] => h [2] => o [3] => j )

Nyní nastavíme maximální délku úseku, kterou by měl mít každý prvek v poli:

$text = "Ahoj";
print_r(str_split($text, 3)); // Rozdělení textového řetězce do prvků pole po 3 znacích

Hodnoty prvků v poli budou vypadat takto:

Array ( [0] => Aho [1] => j )

Jak můžeme vidět, délku tří znaků v prvku poli splňuje pouze prvek na indexu 0. Jedná se tedy o maximální délku úseku v prvku pole, kde na indexu 1 nalezneme pouze jeden znak.

Pokud do funkce str_split() vložíme vícebajtový řetězec, například s diakritikou, je rozdělen na jednotlivé bajty. Tato funkce totiž není tzv. Multibyte safe a některé znaky nemusí být správně zobrazeny!

Příkladem může být text, který obsahuje znaky s diakritikou:

$text = "sloní";
print_r(str_split($text));

Poslední znak í ve slově sloní je tzv. více-bajtový (multibyte) a zabere více jak 2 bajty. Pokud bychom použili funkci strlen(), kterou si vysvětlíme později, dostaneme nesprávnou délku textového řetězce 6. Text je tak nesprávně rozdělen a k tomu tam jsou nesmyslné znaky:

Array ( [0] => s [1] => l [2] => o [3] => n [4] => � [5] => � )

Existuje ovšem multibyte safe varianta funkce s názvem mb_str_split() a nemusíme již mít žádné obavy s použitím diakritiky.

V další lekci, Rozdělování a spojování textových řetězců - 2. díl, se dozvíme, jak nahrazovat, měnit znaky nebo celé úseky textových řetězců.


 

Předchozí článek
PHP funkce pro výpis textových řetězců
Všechny články v sekci
PHP funkce
Přeskočit článek
(nedoporučujeme)
Rozdělování a spojování textových řetězců - 2. díl
Článek pro vás napsal Pavel Vaněček
Avatar
Uživatelské hodnocení:
9 hlasů
Autor se věnuje psaní článků na Itnetwork.cz
Aktivity