9.1 Funkce pro pole
9.1.1 Array_unique
Syntaxe:
array_unique (pole)
Příkaz array_unique odstraní z pole všechny nalezené duplicitní položky a vrátí pole bez duplicit.
Je-li nalezeno více prvků se stejnou hodnotou, zachová se první z nich a zbývající se smažou. Při porovnávání hodnot se interně pracuje s hodnotami převedenými na řetězce (např. číslo 4 se považuje za stejnou hodnotu jako řetězec 4).
Klíče se zachovají.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev){
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h." --- ",var_dump($h),"<BR>";
}
}
$pole=array(4,3,"4",2,"text");
vypis($pole, "pole");
$pole_bez=array_unique($pole);
vypis($pole_bez, "pole_bez");
?>
</BODY>
</HTML>
9.1.2 Implode
Syntaxe:
implode ([oddělovač,] pole)
Příkaz Implode vrací řetězec vytvořený z hodnot prvků pole oddělených zadaným oddělovačem.
Pokud se vynechá oddělovač, budou prvky pole sloučeny přímo za sebe. Oddělovač může být jakýkoliv řetězec.
9.1.3 Explode
Syntaxe:
explode (oddělovač, řetězec [, limit])
Příkaz Explode rozdělí řetězec do prvků pole podle zadaného oddělovače.
Oddělovač nelze vynechat, zadáme-li oddělovač jako prázdný řetězec, vrátí funkce Explode False a vygeneruje chybové varování.
Třetí parametr limit je nepovinný, je to číslo vyjadřující maximální počet prvků vráceného pole. Pokud by vrácené pole mělo obsahovat více prvků než je stanovený limit, bude poslední prvek v poli obsahovat celý zbytek řetězce.
Funkce Implode a Explode patří také do řetězcových funkcí.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev){
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h." --- ",var_dump($h),"<BR>";
}
}
$pole=array(4,3,"4",2,"text");
echo "<B>Původní pole</B><BR>";
vypis($pole, "pole");
$retez=implode(",",$pole);
echo "<BR><B>Řetězec získaný pomocí implode</B><BR>";
echo $retez;
echo "<BR>";
echo "<BR><B>Pole získané pomocí explode bez limitu</B><BR>";
$pole2=explode(",",$retez);
vypis($pole2,"pole2");
echo "<BR>";
echo "<BR><B>Pole získané pomocí explode - limit 3</B><BR>";
$pole2=explode(",",$retez,3);
vypis($pole2,"pole2");
?>
</BODY>
</HTML>
9.1.4 Shuffle
Syntaxe:
shuffle (pole)
Tímto příkazem se náhodně zamíchají prvky pole. Klíče se nezachovají.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev){
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
}
$pole=range(1,5);
echo "<B>Původní pole:</B><BR>";
vypis($pole,"pole");
shuffle($pole);
echo "<BR>";
echo "<B>Zamíchané pole pomocí shuffle:</B><BR>";
vypis($pole,"pole");
?>
</BODY>
</HTML>
9.1.5 Min
Syntaxe:
min(pole)
min(číslo1, číslo2 [, číslo3, …])
Pokud je jako jediný parametr příkazu Min uvedeno pole, vrátí tento příkaz nejmenší prvek pole. Pole musí obsahovat alespoň jeden prvek.
Příkaz min je vhodný pro vyhledávání minimální hodnoty ze souboru čísel. Pokud je v závorce uvedeno několik čísel (alespoň dvě), vrátí nejmenší z nich.
9.1.6 Max
Syntaxe:
max(pole)
max(číslo1, číslo2 [, číslo3, …])
Pokud je jako jediný parametr příkazu Max uvedeno pole, vrátí tento příkaz největší prvek pole. Pole musí obsahovat alespoň jeden prvek.
Příkaz max je vhodný pro vyhledávání maximální hodnoty ze souboru čísel. Pokud je v závorce uvedeno několik čísel (alespoň dvě), vrátí největší z nich.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
$pole=array(5,6,2,-1);
echo "Pole obsahuje čísla: ".implode(", ",$pole)."<BR>";
echo "Minimum: ".min($pole)."<BR>";
echo "Maximum: ".max($pole)."<BR>";
echo "<BR>";
echo "Minimum z čísel 2, -1, 5 : ".min(2,-1,5)."<BR>";
echo "Maximum z čísel 2, -1, 5 : ".max(2,-1,5)."<BR>";
?>
</BODY>
</HTML>
Poznámka
Funkce Min a Max umí pracovat i s nečíselnými parametry typu řetězec (který vyhodnocuje jako 0) nebo s kombinacemi parametrů, nicméně pro naše účely toto potřebovat nebudeme.
9.1.7 Array_merge
Syntaxe:
array_merge (pole1, pole2 [, pole3, …])
Příkaz Array_merge sloučí pole uvedená jako parametry tohoto příkazu a vrací výsledné pole.
Pokud jsou v poli číselné klíče, pak se automaticky přeindexují od nuly.
Řetězcové klíče se zachovají.
Pokud by se v polích vyskytovaly položky se stejným řetězcovým klíčem, pak hodnoty těchto položek z následujícího pole nahradí hodnoty položek předchozího pole se stejným klíčem.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev){
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
}
$pole1=array(5,6,7,8);
$pole2=array(7,8,9,10);
vypis($pole1,"pole1");
echo "<BR>";
vypis($pole2,"pole2");
echo "<BR>";
$sloucene=array_merge($pole1,$pole2);
vypis($sloucene,"sloucene");
echo "<BR>";
$pole1=array(1=>5,2=>6,3=>7,4=>8);
$pole2=array(3=>7,4=>8,5=>9,6=>10);
vypis($pole1,"pole1");
echo "<BR>";
vypis($pole2,"pole2");
echo "<BR>";
$sloucene=array_merge($pole1,$pole2);
vypis($sloucene,"sloucene");
echo "<BR>";
$pole1=array("a"=>5,"b"=>6,"c"=>7,"d"=>8);
$pole2=array("c"=>10,"d"=>11,"e"=>12,6=>10);
vypis($pole1,"pole1");
echo "<BR>";
vypis($pole2,"pole2");
echo "<BR>";
$sloucene=array_merge($pole1,$pole2);
vypis($sloucene,"sloucene");
?>
</BODY>
</HTML>
9.1.8 Array_slice
Syntaxe:
array_slice ($pole, start [, počet prvků])
Příkaz Array_slice vrátí vybranou část pole, která je vymezena parametry start a počet prvků.
Kladná hodnota parametru start určuje, od kterého prvku od začátku budou prvky pole vybírány (první prvek - start 0, druhý prvek - start 1 atd.).
Záporná hodnota parametru start určuje, od kterého prvku od konce budou prvky pole vybírány (poslední prvek - start -1, druhý prvek od konce - start -2 atd.).
Pokud nebude zadán parametr určující počet prvků, budou vráceny všechny prvky pole od pozice start až do konce pole.
Kladná hodnota parametru počet prvků určí počet prvků vráceného pole. Pokud počet prvků bude větší, než počet prvků zbývající do konce pole od pozice start, výpis končí s koncem pole.
Záporná hodnota parametru počet prvků určí, kolik prvků od konce pole bude končit výpis prvků vráceného pole (-1 znamená, že se výpis skončí před posledním prvkem pole).
Pokud žádný prvek pole nesplní vstupní parametry příkazu, bude vráceno prázdné pole.
Řetězcové asociativní klíče se zachovávají, číselné klíče se přeindexují od nuly.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
$pole1=array(5,6,7,8,9,10,11,12);
vypis ($pole1,"pole1","Původní pole");
vypis (array_slice($pole1,4),"pole1","Výpis od 5. prvku do konce");
vypis (array_slice($pole1,-2),"pole1","Výpis od 2. prvku od konce do konce");
vypis (array_slice($pole1,2,3),"pole1","Výpis od 3. prvku 3 prvky");
vypis (array_slice($pole1,2,-1),"pole1","Výpis od 3. prvku, skončí 1 prvek před koncem");
vypis (array_slice($pole1,-2,-1),"pole1","Výpis od 2. prvku před koncem, skončí 1 prvek před koncem");
vypis (array_slice($pole1,-2,1),"pole1","Výpis jednoho prvku od 2. prvku před koncem");
?>
</BODY>
</HTML>
9.1.9 Array_diff
Syntaxe:
array_diff (pole1, pole2 [, pole3, …])
Tento příkaz vrátí pole všech prvků z pole1, které se nevyskytují v žádném z dalších polí. Porovnávají se hodnoty prvků.
Vazba klíč - hodnota se zachovává.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
$pole1=array("a"=>5,"b"=>6,"c"=>7,"d"=>8,"e"=>9);
$pole2=array(5,10,15);
$pole3=array(6,11,16);
$vysledek=array_diff($pole1,$pole2,$pole3);
vypis($pole1,"pole1","Prvky pole1:");
vypis($pole2,"pole2","Prvky pole2:");
vypis($pole3,"pole3","Prvky pole3:");
vypis($vysledek,"vysledek","Rozdíl pole1-pole2-pole3");
?>
</BODY>
</HTML>
9.1.10 Array_intersect
Syntaxe:
array_intersect (pole1, pole2 [, pole3, …])
Tento příkaz vrátí pole všech prvků z pole1, které se současně vyskytují ve všech polích uvedených jako parametry tohoto příkazu. Je to průnik polí.
Vazba klíč - hodnota se zachovává.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
$pole1=array("a"=>5,"b"=>6,"c"=>7,"d"=>8,"e"=>9);
$pole2=array(5,7,10,15);
$pole3=array(6,5,7,16);
$vysledek=array_intersect($pole1,$pole2,$pole3);
vypis($pole1,"pole1","Prvky pole1:");
vypis($pole2,"pole2","Prvky pole2:");
vypis($pole3,"pole3","Prvky pole3:");
vypis($vysledek,"vysledek","Průnik pole1,pole2,pole3");
?>
</BODY>
</HTML>
9.1.11 Array_reverse
Syntaxe:
array_reverse(pole,uchovat klíče)
Tento příkaz vrátí pole prvků pole v opačném pořadí. Vazba asociativních řetězcových klíčů na hodnoty se zachová, vazba číselných klíčů na hodnoty se zachová, je-li parametr uchovat klíče nastaven na True, jinak dojde k přeindexování od nuly.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
$pole1=array("a"=>5,"b"=>6,"c"=>7);
$vysledek1=array_reverse($pole1);
$pole2=array("10"=>5,"12"=>6,"5"=>7);
$vysledek2=array_reverse($pole2);
vypis($pole1,"pole1","Prvky pole1:");
$a="Prvky pozpátku<BR>řetězcové klíče se zachovají";
vypis($vysledek1,"vysledek1",$a);
vypis($pole2,"pole2","Prvky pole2:");
$a="Prvky pozpátku<BR>číselné klíče se přeindexují";
vypis($vysledek2,"vysledek2",$a);
?>
</BODY>
</HTML>
9.1.12 Array_map
Syntaxe:
array_map ("funkce",pole [, další pole])
Příkaz Array_map vrací pole prvků původního pole, na které byla aplikována specifikovaná funkce. Tato funkce může být uživatelsky definovaná funkce nebo příkaz PHP.
Počet parametrů volané funkce by měl být stejný, jako počet polí uvedených v příkazu array_map. Volaná funkce se v příkazu array_map uvádí jako řetězec.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
function cm_na_palce($a){
return ($a/2.54);
}
$cm=array(0,1,2,3,4,5);
$palce=array_map("cm_na_palce",$cm);
vypis($cm,"cm","Pole centimetrů:");
vypis($palce,"palce","Pole palců:");
?>
</BODY>
</HTML>
Array_map s více poli
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
function retezeni($a,$b){
return ($a." ".$b);
}
$jmeno=array("Jiří","Jan","Vlasta","Václav");
$prijmeni=array("Zelený","Veselý","Malá","Pěkný");
$retez=array_map("retezeni",$jmeno,$prijmeni);
vypis($jmeno,"jmeno","Jména:");
vypis($prijmeni,"prijmeni","Příjmení:");
vypis($retez,"retez","Zřetězení jména a příjmení<BR>do pole:");
?>
</BODY>
</HTML>
Sloučení dvou polí do jednoho dvourozměrného pole
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev,$nadpis){
echo "<B>".$nadpis."</B><BR>";
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
echo "<BR>";
}
$jmeno=array("Jiří","Jan","Vlasta","Václav");
$prijmeni=array("Zelený","Veselý","Malá","Pěkný");
// sloučení dvou polí do nového dvourozměrného pole
$nove=array_map(null,$jmeno,$prijmeni);
vypis($jmeno,"jmeno","Jména:");
vypis($prijmeni,"prijmeni","Příjmení:");
echo "<B>Dvourozměrné pole:</B><BR>";
foreach ($nove as $k1 => $h1){
foreach ($h1 as $k2 => $h2){
echo "\$nove[".$k1."][".$k2."]=".$h2."<BR>";
}
echo "<BR>";
}
?>
</BODY>
</HTML>
9.2 Příklad - zamíchání pole se zachováním vazby na klíč
Z původního pole získáme pole klíčů, to zamícháme a pak v novém poli budou mít položky postupně hodnoty položek původního pole se zamíchanými klíči. Dojde k prohození hodnot položek v poli.
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY STYLE="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">
<?php
function vypis($pole,$nazev){
foreach ($pole as $k => $h){
echo $nazev."[".$k."]=".$h."<BR>";
}
}
$pole=array("a"=>5,"b"=>6,"c"=>7);
$klice=array_keys($pole);
echo "<B>Původní pole:</B><BR>";
vypis($pole,"pole");
// zamíchání klíčů
shuffle($klice);
echo "<BR>";
echo "<B>Zamíchané klíče pomocí shuffle:</B><BR>";
vypis($klice,"klice");
echo "<BR>";
echo "<B>Prohození hodnot:</B><BR>";
$i=0;
foreach ($pole as $k => $h){
$pole2[$k]=$pole[$klice[$i]];
echo "nové \$pole[".$k."] = ".$pole2[$k]." = původní \$pole[".$klice[$i]."]<BR>";
$i++;
}
echo "<BR>";
echo "<B>Výsledek:</B><BR>";
$pole=$pole2;
vypis($pole,"pole");
?>
</BODY>
</HTML>
9.3 Cvičení
Jiný způsob zamíchání prvků v poli se zachováním klíčů.
Do pole klice si zazálohujeme klíče, do pole hodnoty si zazálohujeme hodnoty a ty příkazem Shuffle promícháme.
Ve výpisu použijeme klíče z pole klice, a k nim přiřazujeme hodnoty z promíchaného pole hodnoty.
Samostatně proveďte.
9.4 Cvičení
Vytvořte pole čísel od 0 do 255.
Pomocí příkazu array_map vytvořte další pole obsahující binární podobu všech čísel z prvního pole. Pro převod použijte příkaz decbin.
Tato dvě pole pomocí array_map slučte do nového dvourozměrného pole.
Pole s binárními čísly a výsledné dvourozměrné pole vypište v přehledné formě.
Domácí úkol
Výpis z předchozího příkladu rozdělte do tří sloupců tabulky.
Shrnutí
- Naučili jste se další příkazy pro práci s poli - array_unique, implode, explode, shuffle, min, max, array_merge, array_slice, array_diff, array_intersect, array_reverse, array_map.
- Znáte již většinu příkazů pro práci s polem, to, co již umíte by vám mělo stačit k základním operacím s poli, v případě zájmu prostudujte další příkazy, které najdete v manuálu PHP.
|