The PHP WTF

Školení, která pořádám

Článek byl psán jako Aprílové povyražení a není tedy myšlen vážně.

Na webu najdete spoustu návodů a rad k programování (mnohde včetně použitelných ukázek), ať už obecných nebo těch zaměřených přímo na PHP. Jeden z nejlepších serverů tohoto druhu, se kterými jsem se setkal, je The PHP WTF. Kromě ukázek kódu, které jsou ihned použitelné v praxi, poskytuje i kvalitní výklad problematiky. Podívejte se třeba na to, jak lze otestovat lichost nebo sudost čísla:

<?php
// test lichého čísla
if ($x/2 != floor($x/2)) {
    // liché číslo
}

// test sudého čísla
function IsEven($num) {
    if ($num < 0)
        return IsEven(-$num);
    if ($num > 1)
        return IsEven($num-2);
    if ($num == 1)
        return 0;
    else return 1;
}
?>

Obzvlášť druhý příklad se mi jeví velice elegantní a efektivní a ve své aplikaci bych neváhal ho použít bez jakýchkoliv úprav tak, jak je.

Jakub Vrána, Ze zákulisí, 1.4.2005, diskuse: 19 (nové: 0)

Diskuse

ikona Yuhů:

Druhý příklad je obzvláště zdařilý. Myslím, že by se mohl na přednáškách uvádět jako klasický příklad na rekurzi. Píšu si to do poznámek.

Pavel Zbytovský:

Taky klasický přílad se mi zdá vypisování strukturovaných reakcí v diskusi nebo u komentářů. Funkce se volá se svým id a tím se použije pro všechny děti.

ikona Jakub Vrána OpenID:

Díky za námět, už to mám delší dobu mezi tématy článků.

Bohumír Bednařík (BoboCop):

Je to opravdu pěkný příklad rekurze. Musel jsem nad tím sice chviličku přemýšlet, než jsem to pochopil, ale po pak jsem si uvědomil, že je to vlastně velice jednoduché a přitom funkční. Nicméně si nejsem úplně jist tím, jestli by nebylo rychlejší číslo podělit dvěma a zjišťovat zbytek po dělení. Přeci jen u větších čísel by tato funkce mohla být relativně pomalá (alespoň si to myslím - příliš mnoho operací, které by mohly být nahrazeny dvěma - dělení a zjištění zbytku po dělení).

Joe:

Ja myslim, ze lepsi nez rekurzivni reseni je urcite obycejna smycka. imho ale zalezi, do jake miry ma interpret php optimalizovany takove postupy.
<?php
function IsEven($num)
{
   
    $num
= ($num<0)?-$num:$num;
    $even = true; while($num-->0) $even = !$even;
    return $even;
}
?>

puco:

Ta rekurzia je mozno pekny priklad ale urcite by som to nepuzival. Preco nepouzit function IsEven($num)
{ return ($num % 2)?0:1; }. Ta rekurzia mi pripomina  prolog.

puco:

ze ja sa nepozrem do kalendara aky je datum a potom to tak vypada

Jakub Podhorský:

imho by to mělo vracet true a false a ne 1 a 0 :)

pif:

asi tak, nechapu proc delat veci slozite kdyz to jde na jeden radek :)

//pomineme ze se to hodi tak na prednasku

ikona llook:

What the f***?

Jakub Podhorský:

mimochodem ještě k The PHP WTF.....ten článek není o tom jak efektivně zjistit lichost nebo sudost čísla ale poukazuje přesně na to jak se to dělat nemá...proč používat zbytečně složitou a pomalou rekurzi když to všechno zvádnu pomocí operátorů

jak zde už zaznělo je to krásný příklad toho jak se používá rekurze ale používat to v provozu? děkuji ne zbytečně to prodlužuje kód

ikona Jakub Vrána OpenID:

Lidi, vždyť to byl Apríl. Takhle pitomý způsob zjišťování lichého čísla samozřejmě nemůže nikdo myslet vážně a rozhodně se nehodí ani na přednášku.

Joe:

v zadnem pripade se neda souhlasit s tim, ze je to "krasny priklad rekurze". jestlize mi funkce ve svem tele zmeni svuj obsah a zavola se znovu jen aby se podminka volani preskocila, po navratu z5 se vykonal znovu zbytecne kod neni rekurze, ale cista pomsta svemu hostingu :)

Tomáš:

Mě se jako nejrychlejší způsob jeví:

<?php
function isEven($num) {  return ($num & 1)==0; }
?>

pif:

taky díky za tu inspirativní sajtu s code snippets (PHP WTF), je tam spousta nápadů, který se budou hodit! super

jenom nevím proč se menuje tak difně

pif:

kdo to tady pise za me?

ikona Jakub Vrána OpenID:

Můžu ti říct jenom tolik, že to byl někdo z adresy ch-81-1.coolhousing.cz. Mohl to ale být nějaký tvůj jmenovec.

sh:

jen takovy dotaz neslo by na zjisteni sudeho cisla pouzit taky ten prvni priklad akorat misto != by tam mohlo byt ==
<?php
if ($x/2 == floor($x/2)) {
    // sudé číslo
}
?>

ikona v6ak:

Určitě, ale toto je kód spíš pro pobavení. Samozřejmě, nejlepším způsobem bude asi modulo dělení: $x%2 == 0 pro sudé a analogicky pro liché.

BTW: Škoda, že ten server tu už není :(

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.