Pole - Český PHP manuál

PHP Manuál Pole Pole - Český PHP manuál

V tomto článku si vysvětlíme, k čemu pole slouží a jak s polem v PHP pracovat různými způsoby.

Pole

Pole je datový typ a obecně slouží k uložení více hodnot stejného typu, které spolu nějak logicky souvisí. Pomocí pole můžeme mít v proměnné např. obsah 30ti textových polí, aniž bychom museli zakládat proměnné $text1, $text2, $text3... až $text30. Založíme pouze jedno pole. To si můžeme představit jako přihrádky v paměti, kde je v každé přihrádce jeden prvek pole. Pole založíme pomocí klíčového slova array:

<?php
$pole = array();

Od PHP 5.4 a vyšší postačí pouze:

<?php
$pole = [];

V proměnné $pole je nyní prázdné pole. Založit můžeme samozřejmě pole již s nějakými hodnotami, jednoduše je zapíšeme do závorky a oddělíme čárkami:

<?php
$barvy = array('červená', 'zelená', 'žlutá', 'fialová');

K prvkům pole přistupujeme přes hranatou závorku (tzv. indexer). Takto založené pole je tzv. číselně indexované. Prvky jsou číslovány od nuly a přistupujeme k nim pomocí indexů:

<?php
$barvy = array('červená', 'zelená', 'žlutá', 'fialová');
echo $barvy[2];

Výstup:

žlutá

PHP je interpretovaný jazyk a proto si může dovolit poskytnou programátorovi vysoký komfort. Pro začátek si řekněme, že pole v PHP jsou "nafukovací". Nemají pevnou velikost, můžeme do nich prvky libovolně přidávat:

<?php
$barvy = Array('červená', 'zelená', 'žlutá', 'fialová');
$barvy[] = 'bílá';

Prázdné závorky odkazují na další index do pole, který v něm ještě není. Takto do něj můžeme zapsat další prvek. [] ukazuje vždy na index o jednu větší než všechny indexy v poli:

<?php
$barvy[6] = 'modrá';
$barvy[4] = 'zelená';
$barvy[] = 'žlutá';
print_r($barvy);

Výstup:

Array
(
    [6] => modrá
    [4] => zelená
    [7] => žlutá
)

Také víme, že PHP neexistující proměnnou po přiřazení založí. Pole tedy nemusíme ani deklarovat (i když to není nejvhodnější nápad) a stačí prvky uložit:

<?php
$barvy[0] = 'červená';
$barvy[1] = 'zelená';
$barvy[2] = 'žlutá';
$barvy[3] = 'fialová';

Indexy si nyní musíme hlídat manuálně. Pole si můžeme vypsat pomocí funkce print_r($barvy), vypadá takto:

Array
(
    [0] => červená
    [1] => zelená
    [2] => žlutá
    [3] => fialová
)

Iterace prvky pole

Asi bychom všichni uměli prvky v poli vypsat (nebo nějak zpracovat). Možná by nás napadl podobný postup:

<?php
$barvy = array('červená', 'zelená', 'žlutá', 'fialová');
echo $barvy[0] . ' ' . $barvy[1] . ' ' . $barvy[2] . ' ' . $barvy[3];

Toto jistě není nejchytřejší způsob, co kdyby pole mělo tisíc prvků? Použijeme foreach cyklus, který projede všechny prvky pole:

<?php
$barvy = Array('červená', 'zelená', 'žlutá', 'fialová');
foreach ($barvy as $barva)
{
        echo $barva . ' ';
}

Výstup:

červená zelená žlutá fialová

Do pole si můžeme samozřejmě ukládat cokoli, může jít o textové řetězce, čísla i objekty.

Reference

Je nutné zmínit, že celá pole a i prvky pole v foreach cyklu se předávají jako kopie, nikoli referencí. To může být nezvyklé a také to může zapříčinit problémy se změnou jejich hodnoty, pokud je předáváme v parametru funkce nebo s nimi pracujeme v cyklu. Tento kód nebude fungovat:

<?php
// Tento kód nebude fungovat

$pole = array(1, 2, 3);
foreach ($pole as $prvek)
{
        $prvek = 1;
}

print_r($pole);

Ačkoli to může vypadat, že jsme nastavili všechny prvky pole na samé jedničky, pole se vůbec nezměnilo. Prvek, do kterého jsme přiřazovali, byl totiž pouhou kopií prvku z pole. Referenci na prvek (nebo pole) si vynutíme pomocí znaku '&':

<?php
$pole = array(1, 2, 3);
foreach ($pole as &$prvek)
{
        $prvek = 1;
}

print_r($pole);

Nyní vše funguje tak, jak má. Obdobná situace by nastala při předání pole funkci:

<?php
function zmenPole($pole)
{
        $pole[0] = 3;
}

$pole = Array(1, 2, 3);
zmenPole($pole);
print_r($pole);

Opět se nic nezmění, celé pole se před předáním funkci zkopíruje a změníme pouze jeho kopii, která se poté zahodí. Vyřešit to můžeme buď tím, že vrátíme kopii pole z funkce a tou zas nahradíme naše původní pole. Nebo můžeme použít referenci (to mi přijde vzhledem ke konvencím z dalších programovacích jazyků logičtější):

<?php
function zmenPole(&$pole)
{
        $pole[0] = 3;
}

$pole = Array(1, 2, 3);
zmenPole($pole);
print_r($pole);

Typy prvků

Další specialitou dynamického PHP je to, že každý prvek v poli může být jiného typu a některé prvky (indexy) v poli být dokonce ani nemusí:

<?php
$pole[2] = "Text";
$pole[3] = 12;
$pole[8] = Array("Vnořené pole", 8);
print_r($pole);

Výstup:

Array
(
    [2] => Text
    [3] => 12
    [8] => Array
        (
            [0] => Vnořené pole
            [1] => 8
        )

)

O dalším využití pole pojednává článek asociativní a vícerozměrná pole.


 

  Aktivity (1)

Manuál pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Miniatura
Všechny články v sekci
Pole - Český PHP manuál

 

 

Komentáře
Zobrazit starší komentáře (6)

Avatar
Kit
Redaktor
Avatar
Kit:

HipHop sice neznám, ale princip není složitý. Ze zdrojáku se místo překladu jen vytvoří derivační strom, který se pak interpretuje. K tomu je přibalený slovník, který vyřeší problémy s dynamickými názvy.

Python se mi jeví dostatečně objektový. Pro změnu jsem moc nezkoumal Ruby, i když občas používám některé programy v něm napsané, např. Haml. Na Pythonu se mi hlavně líbí velmi stručný zápis. A také interaktivnost. Napíšu příkaz a hned se provede. Napíšu funkci a pokud je syntakticky v pořádku, je k dispozici. Pokud není, vyhodí výjimku a stále platí ta původní. Můžu tak upravovat živý pythonský server přímo za chodu.

Odpovědět 16.9.2012 18:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
HAPPY DAY
Člen
Avatar
HAPPY DAY:

ahoj je mi trochu líto, že jsi neukázal příklad pro další index v poli:
$jazyky[1] = "čeština";
$jazyky[] = "angličtina";
$jazyky[] = "bulharština";
...

Editováno 16.9.2012 18:28
Odpovědět 16.9.2012 18:27
Kdo pozdě chodí, sám sobě škodí (AUTOR: já)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na HAPPY DAY
David Čápka:

Cituji článek:

$barvy[] = 'bílá';

"Prázdné závorky odkazují na další index do pole, který v něm ještě není. Takto do něj můžeme zapsat další prvek."

Je dobré komentovat jen pod to, co jsi četl, jinak nemá komentář žádnou váhu.

Odpovědět 16.9.2012 18:55
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Michal Doubek (HAPPY DAY) to zřejmě myslel jinak:

$barvy[5] = 'bílá';
$barvy[] = 'modrá';

Výsledek:

Array
(
    [5] => bílá
    [6] => modrá
)
Odpovědět 16.9.2012 19:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Mohu tam dodat tento příklad, ale přijde mi, že je to z článku patrné, když se mluví o dalším indexu.

Odpovědět 16.9.2012 19:16
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Možná by stačilo doplnit jeden řádek do posledního příkladu.

Zkusil jsem ještě tuhle blbinu:

<?php
$barvy[6]='modrá';
$barvy[4]='zelená';
$barvy[]='žlutá';
print_r($barvy);

s výsledkem:

Array
(
    [6] => modrá
    [4] => zelená
    [7] => žlutá
)
Odpovědět 16.9.2012 19:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

OK, je to tam, díky :)

Odpovědět 16.9.2012 20:32
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Při zkoumání automatických indexů jsem přišel na další vlastnost: Pokud uděláš unset() na poslední položku pole a pak přidáš další prvek, použije se až následující index. Indexy se tedy nerecyklují. Je to podobné chování jako u autoindexu v databázi.

Pokud však poslední prvek odebereš funkcí array_pop(), index se použije znovu. Z toho je vidět, že zdánlivě ekvivalentní úpravy mohou mít různé postranní efekty.

Odpovědět  +2 16.9.2012 20:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
HAPPY DAY
Člen
Avatar
Odpovídá na David Čápka
HAPPY DAY:

možná jsem úplně nevyjádřil co jsem chtěl říci. šlo o to, že pro to nebyl samostatný příklad a popis. naspal jsi k tomu jednu větu, což je škoda neboť je to zajímavé téma na experimentování

Odpovědět 17.9.2012 15:42
Kdo pozdě chodí, sám sobě škodí (AUTOR: já)
Avatar
Kit
Redaktor
Avatar
Odpovídá na HAPPY DAY
Kit:

Pole v PHP je v principu jednoduché, ale je možné ho využít k mnoha různorodým účelům. Dá se z něj udělat fronta, zásobník, seznam, slovník, strom, halda,... Prostě je tak mnohotvárné, že se nedá komplexně popsat v jednom článku.

Odpovědět 17.9.2012 15:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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.

Zobrazeno 10 zpráv z 16. Zobrazit vše