Millainen (rekursiivinen varmaankin) funktio pitäisi rakentaa, jotta voisin saada tiedostolle uudelleennimeämisvaiheessa uniikin nimen? Eli jos "erkki.jpg" on jo olemassa, kokeillaan "erkki1.jpg". Jos se on jo olemassa, kokeillaan "erkki2.jpg", jne. Tummemman harmaat aivosolut jumittavat tänään hieman yli.
Ei tuossa rekursiota tarvitse, vaikka saisihan sen niinkin tehtyä.
Yksinkertainen silmukka riittää (kielestä riippuen pitää luultavasti tehdä jonkin verran muutoksia):
sub tiedoston_nimi($) { my $nimi = shift; my ($alku, $loppu) = split /\./, $nimi; my $laskuri = ""; while (-e "$alku$laskuri.$loppu") { $laskuri++; } return "$alku$laskuri.$loppu"; }
Tuossa $nimi
on parametri, joka funktiolle annettiin ja -e
funktio joka tarkistaa, onko tiedosto olemassa.
Eli PHP:llä niinkuin näinkö?
<?php function tiedostonnimi($nimi){ list($alku, $loppu) = explode(".", $nimi); $laskuri = ""; while(file_exists("kansio/$alku$laskuri.$loppu")){ $laskuri++; } return "$alku$laskuri.$loppu"; } ?>
Varmaankin joo, en tosin pahemmin osaa PHP:tä. Tuo explode
:n ensimmäinen parametri pitäisi ehkä olla "\."
, koska pisteellä on oma merkitys säännöllisissä lausekkeissa.
Rekursiolla saa kieltämättä hienon ratkaisun:
<?php function etsinimi($alku, $keski, $loppu) { if (file_exists($alku . $keski . $loppu)) return etsinimi($alku, ++$keski, $loppu); return $alku . $keski . $loppu; } echo etsinimi("erkki", "", ".jpg"); ?>
Iso kiitos teille molemmille!
Hmm php:ssä ++"" antaa järkevän tuloksen?
Itsekin vähän samaa mietin... mutta eikö $keski+1
ole vähän sama, kuin mitä ajettiin tässä takaa?
Tyhjä merkkijono tulkitaan nollaksi, kun sitä yritetään kasvattaa yhdellä. Merkintä ++"" ei tunnu kelpaavan PHP:lle, mutta jos muuttujassa $a on tyhjä merkkijono, ++$a palauttaa arvon 1. Oikeastaan ++$a ja $a+1 ovat yhtä "väärin", koska molemmissa on merkkijono, jota kohdellaan kuin lukua.
Aihe on jo aika vanha, joten et voi enää vastata siihen.