Java týden
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy.

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

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.


 

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

 

 

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

Avatar
Alma Mater
Člen
Avatar
Alma Mater:20.7.2019 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.7.2019 19:52
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Odpovídá na Alma Mater
Michal Šmahel:21.7.2019 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.7.2019 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.7.2019 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.7.2019 1:09
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Odpovídá na Alma Mater
Michal Šmahel:23.7.2019 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.7.2019 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.7.2019 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.7.2019 23:46
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
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:25.7.2019 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.7.2019 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.7.2019 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.7.2019 21:03
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Odpovídá na Alma Mater
Michal Šmahel:26.7.2019 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.7.2019 1:53
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Alma Mater
Člen
Avatar
Alma Mater:16.9.2019 0:37

Riešenie som našiel toto: chcem vlastne spracovať Mysql vystúp do poľa.

$i=1;
               foreach ($priatelia as $priatel)
  {

// Želané pole sa bude nachádzať až na poslednom indexe v $pole_priatelia...

$pole_priatelia[]=$priatel['meno'];

// čiže výsledne pole musím vytiahnuť z poslednej iterácie cyklu

// z Mysql vytiahnem počet výstupov, tým nájdem poslednú iteráciu cyklu

if($i==$pocet['pocet_priatelov'])

// a mám želané pole v poli $pole_priatelia napr. Array ( [0] => Peter[1] =>František )
 print_r( $pole_priatelia);

$i++;

 }

Ak pozná niekto jednoduchšie riešenie, môže poskytnúť...

Odpovědět
16.9.2019 0:37
Kopírovanie je jednoduchá forma zdieľania informácii, aby sa šírili tam kde chýbajú..Autorské právo je demonštrácia m...
Avatar
Milan Turyna
Redaktor
Avatar
Milan Turyna:16.9.2019 10:34

Pokud chceš MySQL výstup do pole použil bych toto:

while($r=$sql->fetch()) {
$pole_priatelia[]= $r['meno'];
}

//nepochopil jsem k čemu by mělo sloužit to $i, ale pokud chceš tak si to teda přidej do tý podmínky, počet získáš $sql->rowCount();

print_r($pole_priatelia);
 
Odpovědět
16.9.2019 10:34
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