C# týden Geek tričko zdarma
Pouze tento týden sleva až 80 % na kurzy C# .NET.
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

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

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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.


 

 

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 sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Všechny články v sekci
Pole - Český PHP manuál
Aktivity (1)

 

 

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

Avatar
Petr(K)
Člen
Avatar
Petr(K):19. března 9:51

prosím o radu jak má být strukturovaný obsah v csv souboru, aby se z nej do pole načetl nazev polozky a pote jeji hodnota. Zkousim tvar:

jmeno1=>hodnota1
jmeno2=>hodnota2
jmeno3=>hodnota3

ale po vypsani pole se neprejmenuji cisla radku na "jmeno1" ale vlozi se do hodnoty.

soubor se jmenuje "cz.csv" a pouzivam kod:

$pjazyk = file("cz.csv");
print_r($pjazyk);

dekuji

 
Odpovědět 19. března 9:51
Avatar
Petr(K)
Člen
Avatar
Odpovídá na Petr(K)
Petr(K):19. března 10:14

oprava:
do hodnoty pole se nacte cely radek souboru.

 
Odpovědět 19. března 10:14
Avatar
Alma Mater
Člen
Avatar
Alma Mater:20. července 19:52
Notice: Undefined variable: vysledok in C:\xampp\htdocs...... on line 59
Array ( [0] => 4/ ) Array ( [0] => 4/ [1] => 5/ )

Neviete ako sa dá odstraniť to prvé pole Array ( [0] => 4/ ) , aby zostalo iba Array ( [0] => 4/ [1] => 5/ )

Odpovědět 20. července 19:52
Kopírovanie je forma zdieľania informácii, bez autorských práv sa informácie nezadržiavajú - šíria sa tam kde treba..
Avatar
Odpovídá na Alma Mater
Michal Šmahel:21. července 23:17

Ahoj, když to více rozepíšeš a upřesníš svůj problém, pokusím se ti pomoct. Z tvého popisu jsem toho bohužel moc nepobral.

Pochopil jsem z toho asi toto:

// Máš 2 pole
$prvniPole = [
        0 => 4
];
$druhePole = [
        0 => 4,
        1 => 5
];

// Dále se ztrácím, nevím, co chceš odkud odstraňovat apod.
// TODO: Lépe rozepsat, prosím
Odpovědět 21. července 23:17
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Alma Mater
Člen
Avatar
Odpovídá na Michal Šmahel
Alma Mater:23. července 1:09
foreach ($priatelia as $priatel )
..
// vyhodí hodnoty 4 5
print_r($priatel['d']);

..

No dotaz mi vyhodí dve hodnoty int 4 a int 5

potreboval by som tieto hodnoty dať do poľa, ak je to možne? napr.

$Pole = [
        0 => 4,
        1 => 5
];
Odpovědět 23. července 1:09
Kopírovanie je forma zdieľania informácii, bez autorských práv sa informácie nezadržiavajú - šíria sa tam kde treba..
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Alma Mater
Michal Šmahel:23. července 2:07

Doufám, že už jsem to pochopil. Každopádně podrobnější popis by také neurazil.

<?php

$pratele = [
        0 => [
                'jmeno' => "Petr",
                'd' => 4
        ],
        1 => [
                'jmeno' => "Marek",
                'd' => 5
        ]
];

// První způsob
foreach ($pratele as &$pritel) {
        $pritel = $pritel['d'];
}

// Druhý způsob
array_walk(
        $pratele,
        function (&$item, $key) {
                $item = $item['d'];
        }
);

// Výsledek je v poli $pratele

Pokud jsem to pochopil špatně, poprosím o podrobnější vysvětlení a větší část kódu.

Určitě to jde udělat i lépe, ale nic lepšího mě momentálně nenapadlo.

Odpovědět 23. července 2:07
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Alma Mater
Člen
Avatar
Odpovídá na Michal Šmahel
Alma Mater:24. července 23:46

No v $priatelia sa nachádza dotaz- vrátí všechny jeho řádky jako pole asociativních polí ( $this->data['priate­lia']=$priate­lia;)

a foreach ($priatelia as $priatel )

výpiše riadky asociatívneho poľa $priatel['d'];

toto pole obsahuje dve hodnoty 4 a 5

a tie by som rad dal do poľa napr. $priatel[0]=4; a $priatel[1]=5;
alebo na hodnoty z asociatívneho poľa $priatel['d'] nejako odkazoval, ak je to možné, stačí také vysvetlenie?

Odpovědět 24. července 23:46
Kopírovanie je forma zdieľania informácii, bez autorských práv sa informácie nezadržiavajú - šíria sa tam kde treba..
Avatar
Odpovídá na Alma Mater
Michal Šmahel:25. července 1:41

Už to snad chápu. Na klíči 'd' bude vždy pole o 2 hodnotách nebo se počet hodnot může měnit?

Vstup je tedy například tento?

$pratele = [
        0 => [
                'jmeno' => "Petr",
                'd' => [4, 5]
        ],
        1 => [
                'jmeno' => "Marek",
                'd' => [1, 2]
        ]
];
Odpovědět 25. července 1:41
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Alma Mater
Člen
Avatar
Odpovídá na Michal Šmahel
Alma Mater:25. července 21:03

Na klici 'd' bude viacero hodnot typu integer. napr.

foreach ($priatelia as $priatel )
{
$pole[]=$priatel['d'];
//vypise Array ( [0] => 4 ) Array ( [0] => 4 [1] => 5 )
print_r($pole);
}

Array ( [0] => 4 ) Array ( [0] => 4 [1] => 5 ) s týmto poľom sa dá pracovať, alebo dá sa odstranit Array ( [0] => 4 ) ?

Odpovědět 25. července 21:03
Kopírovanie je forma zdieľania informácii, bez autorských práv sa informácie nezadržiavajú - šíria sa tam kde treba..
Avatar
Odpovídá na Alma Mater
Michal Šmahel:26. července 1:53

No, pořád mi tu něco nehraje. Zkusíme to raději jinak. Opravdu víš, co chceš a jak to vlastně funguje? Jde o to, že když vypisuješ data v poli přes foreach, proběhne většinou několik iterací. V tvém případě právě 2 (v tom modelovém příkladu, který popisuješ).

// První výpis
$pole[0] = [4]; // Array ( [0] => 4 )

// Druhý výpis
$pole[1] = [4, 5]; // Array ( [0] => 4 [1] => 5 )

Zkus si cyklus upravit tak, aby zobrazoval i číslo výpisu:

$i = 0;
foreach(...) {
echo "{$++i}. průběh:";
//...
var_dump($pole);

Abych dozodpověděl otázku... S polem se dá vždy pracovat. Jen tady máš vypsaná 2 pole - na různých klíčích. Ještě to promysli, co opravdu chceš a jestli to dobře chápeš.

Odpovědět 26. července 1:53
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
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 14. Zobrazit vše