Na navigaci | Klávesové zkratky

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).

Mohlo by vás zajímat

Komentáře

  1. 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 ;]

    před 16 lety
  2. 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ě ;)

    před 16 lety
  3. kaja47 - the man with black hat #3

    avatar

    David se, co se ohromování dívek týče, pochopitelně mýlí: https://web.archive.org/…mix/669s.php :D

    před 16 lety | reagoval [5] David Grudl
  4. Jakub Vrána #4

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

    před 16 lety
  5. David Grudl #5

    avatar
    před 16 lety
  6. angel #6

    avatar

    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

    před 16 lety | reagoval [7] David Grudl
  7. David Grudl #7

    avatar

    #6 angle, 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
    před 16 lety
  8. zirafka #8

    jsem ohromena!

    před 16 lety
  9. Slapo #9

    avatar

    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).

    před 16 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

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