Uusimman tiedoston saan näin:
#Asetetaan muuttuja uusinta tiedostoa varten $y = 0; foreach($filenames as $arvo) { $picture = $imgfolder."/".$arvo; #Tarkistetaan, että tiedostopääte on varmisti jpg ja tiedosto muutenkin sallittu if ($arvo != "." && $arvo != ".." && (substr($arvo,-3) == "jpg")) { #Etsitään uusin tiedosto if(filemtime($picture) > $y) { $y = filemtime($picture); $yf = $arvo; } } }
Mutta miten saan viisi uusinta tiedostoa muuttujiin $yf - $yj.
Suosittelisin taulukkojen opettelemisen. Paljon helpompi käyttää, kuin $yj, $yk, $yl... -nimiset muuttujat.
Katsoppas koodivinkeistä, siellä on läjä päin tiedosjoen ja hakemistojen listauksista esimerkkejä.
Täl tyylil sais $yf-$yj muuttujiin, mutta todella epäviisasta käyttää tätä tyyliä:
$c = "fghij"; $p = 0; silmukka{ ${"y".$c[$p]} = $arvo; $p++; }
Kun taas taulukoilla paljon helpompaa:
$lista = array(); $p = 0; silmukka{ $lista[$p] = $arvo; $p++; }
Ps. "silmukka" ei kuulu PHP:n rakenteisiin
kansiokahva = avaakansio(kansio) toista_kunnes(ei ole enää tiedostoja) tiedostot[tiedostonluontiaika(viimeksi_luettu_kansion_tiedosto)] = tiedostonnimi toisto_end järjestätaulukko(tiedostot, NUMEROT)
Tiedostot-taulukko pitää järjestää vastakkaiseen järjestykseen (suurimmasta pienempään), jotta saadaan uusimmat tiedostot ensimmäisiksi. Nyt tiedostot-taulukossa avaimina on tiedostojen luontiajat ja avaimilla osoitetaan tiedostojen nimiin. Sitten vain hakemaan ne taulukon viisi ensimmäistä alkiota. PHP:ssä komennot ovat: opendir, while, readdir, filemtime, rsort(SORT_NUMERIC), closedir. Kannattaa pitää mielessä muuttujien näkyvyysalueet (jos et määrittele tiedostot-taulukkoa silmukan ulkopuolella, sen ei pitäisi myöskään näkyä sinne (en muista kuinka tarkka PHP on tässä asiassa).
Ei luonnistu.. Tällaista skriptiä tarjottiin, mutta ei tuo mielestäni järjestä tiedostoja aikajärjestykseen.
<?php function LoadFiles($dir) { $Files = array(); $It = opendir($dir); if (! $It) die('Cannot list files for ' . $dir); while ($Filename = readdir($It)) { if ($Filename == '.' || $Filename == '..') continue; if(is_dir($Filename)) continue; $LastModified = filemtime($dir . $Filename); $Files[] = array($dir .$Filename, $LastModified); } return $Files; } function DateCmp($a, $b) { return ($a[1] < $b[1]) ? -1 : 0; } function SortByDate(&$Files) { usort($Files, 'DateCmp'); } $Files = LoadFiles('./'); SortByDate($Files); for($i = 0; $i < 10; $i++) { print_r($Files[$i][1]); echo "<br />"; } ?>
Tulostaa:
1131875458
1139757905
1137431471
1137079554
1137262001
1139510697
1137262270
1141825971
1131958002
1131988926
..ja nuo on kaikkea muuta kuin järjestyksessä.
Selvennetään nyt vielä tarkoitustani. Tarkoitukseni on saada gallerian viiden uusimman kuvan yhteyteen teksti (Uusimpia). Nykyisellä skriptilläni saan tekstin uusimpaan tiedostoon, mutta haluaisin tekstin esim. 3-5 uusimpaan kuvaan.
Uusimman etsintäkoodi ensimmäisessä viestissäni ja tiedon tulostus galleriaan näin:
No niin, nyt olen hieman päässyt eteenpäin ja saan jo listattua x-määrän uusimpia tiedostoja, mutta...
<?php $hakemisto = "./testi/"; function LoadFiles($hakemisto) { $filutaulukko = array(); if(!($kahva = @opendir($hakemisto)))die("Kansion ".$hakemisto." avaaminen ei onnistu!"); while ($filu = readdir($kahva)) { if($filu != "." && $filu != ".." && is_dir($filu) == false) { $muokattu = filemtime($hakemisto.$filu); $filutaulukko[] = array($muokattu, $hakemisto.$filu, $filu); } } return $filutaulukko; } $filutaulukko = LoadFiles($hakemisto); sort($filutaulukko); echo "Kansion \"".$hakemisto."\" neljä uusinta tiedostoa:<br /><br />"; for($i = (count($filutaulukko)-1); $i > (count($filutaulukko)-5); $i--) { echo $filutaulukko[$i][2]; echo "<br />"; } ?>
Jostain syystä tuo pätkä ei jätä kansioita huomioimatta - paitsi jos tutkitaan kansio, jossa skripti on.. Jos tutkii jonkin muun hakemiston, myös kaikki kansiot listataan..
if(is_file($filu)) ...
Luulisin tuon korvaavan kaikki nuo kolme eri iffiä.
Korvaahan se.. :)
Ongelma on silti vielä olemassa..
Jos tiedostolistaus "haetaan" skriptin ulkopuolisesta hakemistosta, ei tuo is_file pelitä oikein, vaan mukaan tulee myös hakemistoja.
ja tuoreimpana erikoisuutena skripti ei tunnista is-file-funktion avulla galleria-kansiostani muita tiedostoja tiedostoiksi kuin Thumbs.db- tiedoston.
if(is_file($hakemisto.$filu)) ...
Stupid Me.. Kiitos erittäin paljon.. Nyt toimii loistavasti..
Hyi Thumbs.db :). Se on eri kansion Thumbs.db se, jonka skripti tunnistaa. Ja tarkistus T.M.:n ylläolevan pätkän malliin.
Laitanpa vielä lopullisen version..
#Uusimmat tiedostot function uusimmatTiedostot($hakemisto) { $filutaulukko = array(); if(!($kahva = @opendir($hakemisto)))die("Kansion ".$hakemisto." avaaminen ei onnistu!"); while($filu = readdir($kahva)) { if(is_file($hakemisto.$filu) == true) { $muokattu = filemtime($hakemisto.$filu); $filutaulukko[] = array($muokattu, $hakemisto.$filu, $filu); } } sort($filutaulukko); return $filutaulukko; } #EO Uusimmat tiedostot
..ja tulostusosa..
" == true" on turha, pelkkä if(is_file(...)) riittää
Aihe on jo aika vanha, joten et voi enää vastata siihen.