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:
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:
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:
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:
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ů.