NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Asociativní a vícerozměrná pole - Český PHP manuál

Pole v PHP je ve skutečnosti pole asociativní, jeho prvky mají tedy podobu klíče a hodnoty. Předešlá představa pole jako jednotlivých přihrádek může být zachována, pouze není nutné přihrádky číslovat. Číselný index byl ve skutečnosti klíčem, stejně tak ale můžeme použít jako index textový řetězec. To je velmi výhodné pro získávání hodnot z databáze. Pole nám tedy může reprezentovat nějakou entitu a nemusíme vždy zakládat třídu.

Ukažme si příklad, jednotlivé klíče a hodnoty párujeme pomocí operátoru => :

<?php
$pocitac = array(
    'zakladni_deska' => 'Asus ABC123',
    'procesor' => 'Intel Core i5',
    'pevny_disk' => 1,
    'RAM' => 8,
);

print_r($pocitac);

Výstup:

Array
(
    [zakladni_deska] => Asus ABC123
    [procesor] => Intel Core i5
    [pevny_disk] => 1
    [RAM] => 8
)

Všimněte si čárky za posledním prvkem pole, PHP nám ji tam dovolí napsat, až budeme pole rozšiřovat, nezapomeneme na ni. Klíčem může být pouze celé číslo nebo textový řetězec. Pokud tomu tak nebude, PHP klíč na tento typ zkonvertuje, tedy např. z hodnoty true udělá 1 a podobně. Pole výše má jednu obrovskou výhodu, na jeho jednotlivé prvky se můžeme odkazovat pomocí textového klíče místo nic neříkajících čísel:

<?php
echo $pocitac['zakladni_deska'];

Kód je přehledný a přesně víme, o co si říkáme. Není nic horšího, než mít zabalených několik číselně indexovaných polí do sebe, po měsíci přijít ke kódu a vůbec nevědět, co je kde uložené. Určitě doporučuji používat asociativní pole namísto číselně indexovaného, pokud to alespoň trochu dává smysl.

Iterace slovníkem

Pokud budeme slovníkem iterovat jako předtím, budeme v prvku dostávat zasebou jednotlivé hodnoty. Můžeme však iterovat celými páry klíč => hodnota, což je mnohdy přirozenější:

<?php
$pocitac = array(
    'zakladni_deska' => 'Asus ABC123',
    'procesor' => 'Intel Core i5',
    'pevny_disk' => 1,
    'RAM' => 8,
);

foreach ($pocitac as $klic => $hodnota)
{
    echo 'Klíč: ' . $klic . ', hodnota: ' . $hodnota . '<br />';
}

Výstup:

Klíč: zakladni_deska, hodnota: Asus ABC123
Klíč: procesor, hodnota: Intel Core i5
Klíč: pevny_disk, hodnota: 1
Klíč: RAM, hodnota: 8

Odstranění prvku z pole

Ještě jsme si neukázali odstranění prvku z pole, používá se k tomu příkaz unset:

<?php
unset($pocitac['procesor']);

Pro číselně indexovaná pole to samozřejmě platí také.

POZOR!, pokud mažeme index z číselně indexovaného pole, zůstane v poli "díra" a znovu se nepřeindexuje:

<?php
$pole = array(1, 2, 3);

// odstraníme prvek 2
unset($pole[1]);

print_r($pole);

Výstup:

Array
(
    [0] => 1
    [2] => 3
)

Kombinace číselně indexovaného a asociativního pole

Ačkoli to není příliš vhodné, pro úplnost si uveďme, jak lze v PHP kombinovat číselně indexované a asociativní pole. Některé klíče nemusíme zadat, ty se poté automaticky očíslují:

<?php
$pole = Array(
'klic' => 'hodnota',
'hodnota2',
5,
6 => 'hodnota 3',
7,
);

print_r($pole);

Výstup:

Array
(
    [klic] => hodnota
    [0] => hodnota2
    [1] => 5
    [6] => hodnota 3
    [7] => 7
)

Vidíme, že klíče jsou indexovány od posledního číselného (numerického) indexu.

Vícerozměrná pole

Jak již víme, pole v sobě může bez problému obsahovat i další pole. Pokud si pole představíme jako řádu přihrádek a do každé přihrádky vložíme další pole, dostaneme tabulku. Pokud bychom opět vložili další pole do každé přihrádky v tabulce, dostaneme krychli a tak dále. Hovoříme potom o vícerozměrných (multidimenzi­onálních) polích. Těm se ale většinou (pokud neprogramujeme zrovna šachovnici nebo rubikovu kostku) chceme vyhnout, protože mohou být velmi nepřehledná. Přesto si udělejme příklad uložení malé násobilky do pole pomocí 2 for cyklů:

<?php
for ($i = 1; $i < 9; $i++)
for ($j = 1; $j < 9; $j++)
$nasobilka[$i][$j] = $i * $j;

print_r($nasobilka);

Výstup je poněkud delší, ale v podstatě je pole takováto tabulka:

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

Další využití pole

PHP pole je jakýsi hybrid klasického pole, které známe např. z céčka a spojového seznamu a ještě hashmapy. Dále dokáže nahradit i frontu nebo zásobník. Zkrátka asi nebudeme muset používat jinou kolekci.


 

Všechny články v sekci
Pole - Český PHP manuál
Článek pro vás napsal David Hartinger
Avatar
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity