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

PHP Manuál Pole 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.


 

  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

Avatar
Kit
Redaktor
Avatar
Kit:

Ta poslední věta o jiné kolekci je velmi výstižná. Skutečně je pole v PHP tak mnohotvárné, že se v něm dá vytvořit jakákoli abstraktní datová struktura. Napomáhá tomu i rozsáhlá sada funkcí, včetně funkcí pro práci se zásobníkem i frontou.

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

Nechci nejak rypat nebo byt doterny ale neskonci cyklus for ($i = 1; $i < 9; $i++) na cisle 8 ?? 9tku uz by nemel vypsat ne ?

 
Odpovědět  +4 31.7.2014 8:45
Avatar
loading84
Člen
Avatar
loading84:

Narazil jsem na pole, které je definováno takto:

$pole=array(array("name"=>"Barbara","age"=>"29"),array("name"=>"Clint","age"=>"31"));


   foreach($pole[0] as $prvek1)
   {
   echo $prvek1.' ';
   }
   echo "<br />";
   foreach($pole[1] as $prvek2)
   {
   echo $prvek2.' ';
   }

Zna někdo elegantnější způsob pro výpis toho pole, než takhle přes dva cykly foreach?

 
Odpovědět 26.10.2015 13:13
Avatar
Dennis Tschamler
Redaktor
Avatar
Odpovídá na loading84
Dennis Tschamler:

Muzes ho vypsat nasledovne:

foreach($pole as $prvek) {
   echo $prvek["name"];
   echo $prvek["age"];
}
 
Odpovědět 26.10.2015 17:16
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 4 zpráv z 4.