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 (multidimenzioná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.