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
Petr Procházka #1
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 ;]
Lamicz #2
#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ě ;)
kaja47 - the man with black hat #3
David se, co se ohromování dívek týče, pochopitelně mýlí: https://web.archive.org/…mix/669s.php :D
Jakub Vrána #4
Do PHP dokumentace to snad ani raději přidávat nebudu…
David Grudl #5
#3 kaja47 - the mane withu blacku hate, 🙂
angel #6
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
David Grudl #7
#6 angle, jojo, ta stránka působí jen zmatky v hlavách programátorů.
zirafka #8
jsem ohromena!
Slapo #9
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).
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.