Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Translate to English… Ins Deutsche übersetzen…

foreach pikoška

Na stránce www.phpbench.com, která je bohužel plná zavádějících měření, jsem narazil na zajímavou konstrukci:

foreach ($arr as $key[] => $val[]);

Funguje to od PHP 4 a jde vlastně o obdobu

$key = array_keys($arr);
$val = array_values($arr);

Vůbec jsem netušil, že za as může následovat podobný výraz. Podíval jsem se do souboru zend_language_parser.output (najdete ve zdrojácích PHP) a ono je možné dokonce vytvářet konstrukce jako foreach ($arr as $key[fce($obj->x)] => $val[$y]). Praktické využití mě nenapadá, dívky tím neohromíte, ale blognout jsem to musel :-)

Ať je alespoň něčím tento spot užitečný: víte, že funkce array_keys má tři parametry?


Ještě ke stránce The PHP Benchmark: snaha autora i vizuální provedení je rozhodně chválihodné, bohužel některé výsledky bez patřičného komentáře vyvolávají dojem, že ta či ona konstrukce je zbytečně pomalá. Pro pochopení je ale potřeba důkladná znalost vnitřností PHP (viz Půvab optimalizace rychlosti, Černá magie optimalizace, Derick Rethans: Understanding the PHP Engine).

Komentáře RSS 2.0 komentářů » přidat

#1 Petr Procházka nový

Ano praktické využití tady asi opravdu nebude ;], zvláště když array_keys a array_values je podle phpbench nepatrně rychlejší, o podle mě v kódu přehlednější. Ohledně třetího parametru array_keys, mě samotného překvapilo že má druhý parametr ;]

Posláno 9. 6. 2008 ve 14.52 | Odpovědět

#2 Lamicz nový

#1: Možná to bude znít pitomě, nejsem žádný PHP expert, ale tuto fci používám právě kvůli tomu druhému parametru, abych nemusel používat foreach a přímo obdržel daný klíč. Jinak IMHO to nemá cenu. Nebijte mě ;)

Posláno 9. 6. 2008 v 17.17 | Odpovědět
avatar

#3 kaja47 - the man with black hat http://k47.cz nový

David se, co se ohromování dívek týče, pochopitelně mýlí: http://k47.cz/komix/669s.php :D

Posláno 9. 6. 2008 ve 22.35 | Odpovědět
Na komentář reagoval [5] David Grudl

#4 Jakub Vrána http://php.vrana.cz nový

Do PHP dokumentace to snad ani raději přidávat nebudu…

Posláno 10. 6. 2008 v 10.40 | Odpovědět
avatar

#6 angel zdenek.dolezal@gmail.com nový

Ta stránka se mi líbí.

Tohle sem ale nepochopil:

For-loop test
With pre calc – sizeof() Total time: 217 µs
Without pre calc – sizeof() Total time: 108846 µs

Surprising results show that if you implement sizeof() there is almost no difference in whether calculating the size of a loop in advance

Posláno 13. 6. 2008 ve 12.10 | Odpovědět
Na komentář reagoval [7] David Grudl
avatar

#7 David Grudl http://davidgrudl.com nový

#6 angel: jojo, ta stránka působí jen zmatky v hlavách programátorů.

  • sizeof je alias pro count – nemá smysl obojí porovnávat
  • v benchmarku je rozdíl způsoben především použitím reference (příkaz global), změřené časy nic nevypovídají
  • komentář autora je zcela mimo mísu
Posláno 13. 6. 2008 ve 12.33 | Odpovědět

#8 zirafka nový

jsem ohromena!

Posláno 14. 6. 2008 v 1.02 | Odpovědět
avatar

#9 Slapo http://www.slapo.net/ nový

Jeden môj predchodca v práci používal takýto spôsob
foreach ($arr as $val);
na priradenie hodnoty posledného prvku poľa $arr premennej $val.

Najprv som si nebol celkom istý, či to naozaj robí to, čo sa zdá, ale rýchly test ukázal, že to tak je. Testovacie pole som aj porovnal s týmito spôsobmi:

$val = end($arr); reset($arr);

a

$val = $arr[ ( count($arr) - 1 ) ];

Toto fungovalo dobre pre malé polia:
foreach ($arr as $val);
Pre väčšie polia to bolo (celkom pochopiteľne) pomalšie ako ostatné spomenuté spôsoby, pričom ak som pridal rád veľkosti poľa, rádovo sa spomalilo aj získanie poslednej hodnoty poľa.

To je len tak pre informáciu, ak by to niekto potreboval alebo náhodou skúšal použiť foreach podobným spôsobom (čo nie je veľmi dobrý nápad).

Posláno 19. 12. 2008 v 11.21 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

phpFashion © 2004, 2010 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.