Rekurze je sexy!

MyEgo.cz

home foto blogy mywindows.cz kontakt

Rekurze je sexy!

PHP 03.04.05

Rekurze je rozhodně velice sexy, protože se s minimem kódu dají dělat mraky operací velice jednoduše :-)

function copyIt($a,$b){
 $c = scandir($a);
 foreach($c as $d) {
  if ($d != '.' && $d != '..') {
   $e = $b.$d;
   $f = $a.$d;
   if (is_dir($f)) {
     mkdir($e);
     copyIt($f.DIRECTORY_SEPARATOR,$e.DIRECTORY_SEPARATOR);
   } elseif (is_file($f))
    copy($f, $e);
  }
 }
}

Otázka pro PHP začátečníky: víte, co tento kód dělá?


Komentáře

  1. 1 lukas 03.04.05, 02:04:49
    FB

    propada mi citelnejsi zapisovat:

    if ($d != '.' && $d != '..')

    jako

    if ( in_array($d, array('.', '..')) )

    Vyhodu to ma, ze to pole lze nadefinovat jako konstantu (nebo "konstantni promennou"). Osobne do ni jeste hazim 'Thumbs.db', ktery samozrejme vytvareji Windows a semtam se pri uploadovani dostane i na server.

  2. 2 Behemoth 03.04.05, 09:04:55
    FB

    Rekurze je sice velmi sexy, ale vzhledem ke kvalitam garbage collection v ZEND enginu je to velmi rychla cesta do pekel (rozumej out_of_memory)

  3. 3 Radek Hulán 03.04.05, 10:04:51
    FB

    [1] ten kód je schválně nečitelný, ale normální programátor by i tak během 3 sekund měl pochopit, co to dělá! ;-)

  4. 4 Petr Bříza 03.04.05, 12:04:55
    FB

    Omlouvám se za svou neznalost, ale copak v php na to není jednoduchý příkaz?
    Jinak pěkný příklad rekurze, zrovna tahle úloha by se bez ní řešila asi dost těžko...

  5. 5 lukas 03.04.05, 01:04:22
    FB

    [1] Teď se dívám na to, co jsem v noci napsal, a samozřejmě tam má před in_array být negace: !in_array(...

  6. 6 llook 03.04.05, 03:04:43
    FB

    Je fakt, že rekurzivně něco zkopírovat se asi bez rekurze neobejde :)
    I když já bych asi zvolil jednodušší možnost (pokud bych na serveru neměl shellovej účet) - přetáhl bych si to na svůj disk, provedl jeden příkaz v shellu a zase uploadnul zpátky.

    [1] Vidím zásadní vadu - při každém průchodu se provádí funkce array, aby vytvořila vždy to samé pole, aby se vzápětí zase uvolnilo.

  7. 7 lp 03.04.05, 04:04:03
    FB

    pekne ;) nebudem prezradzat (aj tak na to kazdy pride, ze te ..... ;)) $a, $b, $c, $d, $e a $f ;)

  8. 8 Non_E 03.04.05, 05:04:43
    FB

    Pěkné, Thumbs.db se dá vypnout v Nástroje -> Nastavení -> Možnosti složky -> Zobrazení a Neukládat miniatury do mezipaměti.

  9. 9 akrij 03.04.05, 10:04:16
    FB

    prosím já to nechápu! mohl by mi to někdo vysvětlit prosim

  10. 10 Michal Tuláček 03.04.05, 11:04:28
    FB

    [6] ale jo... tohle je klasické prohledání stromu + operace nad každým uzlem... to by se dalo vyřešit bez rekurze pomocí zásobníku/fronty a while cyklu... ale musím uznat že už by to tak elegantně asi nevypadalo...

  11. 11 martinpav 04.04.05, 05:04:54
    FB

    Osobne, ked pouzijem rekurziu tak funkciu volam takto:
    $fnc=__FUNCTION__;
    $fnc($arg1,$arg2,$argx...);

    Nikdy neviem ci tu fnc. niekto nepremenuje a potom sa bude cudovat ze to nerobi to co ma.

  12. 12 Jan Pokorny 07.04.05, 08:04:16
    FB

    rekurze je zajimava ..
    hele rado, a co clanek o SPL a lahudkach jako RecursiveIteratorIterator ? s nekolika priklady ? :)

  13. 13 lukas 10.04.05, 12:04:42
    FB

    [6] Jednak to predpokladam PHP optimalizuje (pokud je, je hloupe). Za druhe jsem rikal, ze je fajn nadefinovat si to jako konstantu.

  14. 14 ondra 15.09.05, 09:09:36
    FB

    Tak tahle rekurze mi přijde spíš jako šedá myš. Rozhodně víc sexy mi přijde rekurze:

    quicksort []= []
    quicksort (x:xs) = quicksort [y|y<-xs, y<x ] ++ [x] ++ quicksort [y|y<-xs, y>=x]

    (Pro neznalé funkcionálního programování je to program v Haskellu, kde je rekurze jediným nástrojem.)
    Web se s ním asi moc psát nedá, ale pro to není také určený. Např. na umělou inteligeci je to velmi vhodný nástroj.

  15. 15 hudym 15.11.05, 08:11:32
    FB

    Myslím že kód zkopíruje obsah složky $b do složky $a a to včetně složek a jejich obsahů.

    jestli je to správně...pls posli mi mail...rád bych věděl jak na tom sem....thx

    mhudym@gmail.com

    hudym.com