Rekurze je sexy!

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 15

  1. #1 lukas ▲1 ▼0

    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

    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 autor webu ▲11 ▼0

    [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

    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

    [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

    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

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

  8. #8 Non_E

    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

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

  10. #10 Michal Tuláček

    [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

    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

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

  13. #13 lukas

    [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

    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

    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