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á?
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.
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)
[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á! ;-)
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...
[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(...
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.
pekne ;) nebudem prezradzat (aj tak na to kazdy pride, ze te ..... ;)) $a, $b, $c, $d, $e a $f ;)
Pěkné, Thumbs.db se dá vypnout v Nástroje -> Nastavení -> Možnosti složky -> Zobrazení a Neukládat miniatury do mezipaměti.
prosím já to nechápu! mohl by mi to někdo vysvětlit prosim
[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...
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.
rekurze je zajimava ..
hele rado, a co clanek o SPL a lahudkach jako RecursiveIteratorIterator ? s nekolika priklady ? :)
[6] Jednak to predpokladam PHP optimalizuje (pokud je, je hloupe). Za druhe jsem rikal, ze je fajn nadefinovat si to jako konstantu.
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.
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