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ě

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: Reakce na: pif

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í :(
avatar © 2005-2020 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.