Avatar billede eds Nybegynder
10. april 2006 - 20:08 Der er 30 kommentarer

Fil-liste-script - hvordan får jeg den til kun at vise de 5 først

Hej, jeg har følgende php-kode:

<?
$handle=opendir('./admin/news');
while (false !== ($file = readdir($handle))) {
    if($file != "." && $file != "..") {
echo "". substr($file, 0, -4) ."<br>";
echo "<a href='index.php?side=news/". substr($file, 0, -4) ."&navn=". substr($file, 0, -4) ."'>Læs...</a><br>------------------<br> ";

    }
}
closedir($handle);
?>

Det den gør er at den laver en liste over en række filer en bestemt mappe, mit problem er i midlertid at den laver en liste over alle filerne - hvilket er for mange. Jeg vil kun have den til at vise de 5 nyeste, er der nogen der kan hjælpe mig med det?
Avatar billede jakobdo Ekspert
10. april 2006 - 20:58 #1
Du kan lave en count, og er count talt op til 5, så stopper du while().
Avatar billede eds Nybegynder
10. april 2006 - 21:12 #2
Hmm jeg tror godt at jeg forstår hvad du mener, men jeg kan ikke helt gennemskue hvordan det skal gøres rent kodemæssigt.
Avatar billede coderdk Praktikant
10. april 2006 - 21:20 #3
I stedet for:

$handle=opendir('./admin/news');
while (false !== ($file = readdir($handle))) {

Så lav:

$handle=opendir('./admin/news');
$count = 0;
while (false !== ($file = readdir($handle))) {
  if ( $count++ > 5 ) break;

:)
Avatar billede jakobdo Ekspert
10. april 2006 - 21:34 #4
Men for at få de nyeste, skal du jo sortere efter datotid på en måde.
Måske filemtime() kunne bruges.
Men har du 2 filer som er lavet samtidig, så kan det give lidt problemer.
Avatar billede eds Nybegynder
10. april 2006 - 21:36 #5
Hmm jeg har rodet lidt med det sådan her:

<?
$news = array();
$dir = './admin/news';
$handle=opendir($dir);
while (false !== ($file = readdir($handle))) {
    if($file != "." && $file != "..") {
      $news[$file] = filemtime($dir."/".$file);
    }
}
closedir($handle);
arsort( $news );
foreach ( $news as $fil => $tid )
{
  echo "<b>". substr(basename($fil), 0, -4) . "</b> - " . date( "d/m-Y H:i:s", $tid ) . "<br>";
  echo "<hr>";
}
?>

problemet er bare at den ikke viser de nyeste.
Avatar billede eds Nybegynder
10. april 2006 - 21:37 #6
Nå, det havde du allerede gennemskuet :)
Avatar billede jakobdo Ekspert
10. april 2006 - 22:00 #7
Eds: Som jeg tit siger når folk roder med sådanne ting, hvorfor laver du det ikke i MYSQL?
Så kan du lave et udtræk med: SELECT * FROM nyheder ORDER BY datotid DESC LIMIT 5
så har du de nyeste 5 nyheder.
Dog skal alle dine nyheder så gemmes i mysql og ikke som filer, men din side bliver mere fleksibel.
Avatar billede eds Nybegynder
10. april 2006 - 22:04 #8
Det kan du have helt ret i, dog er jeg ikke specielt meget inde i hvordan man bruger mysql. Det er derfor at jeg har lavet hele det her system kun med filer, det her irrirterer mig dog noget. Men det ville bare være lidt ærgeligt at skulle lave det hele om nu, da det her er det eneste jeg mangler at få gjort færdigt.
Avatar billede jakobdo Ekspert
10. april 2006 - 22:10 #9
Du kunne måske lave: $news[$file] = filemtime($dir."/".$file) . microtime();
Avatar billede erikjacobsen Ekspert
10. april 2006 - 22:12 #10
En tilsvarende løsning http://www.zpiff.dk/php/5newestfiles
Avatar billede eds Nybegynder
10. april 2006 - 22:25 #11
jakobdo, det virker sådan set, problemet er bare at den her så snart at der er mere end 5 filer i mappen stopper med at vise de nyeste filer. Du kan se her http://www.hallofgame.dk/test/index.php (til venstre på siden, under news) den laver sådan set listen fint nok, problemet er bare at der en nyere fil som den ikke viser.
Avatar billede eds Nybegynder
11. april 2006 - 19:10 #12
Nu har jeg forsøgt mig lidt med en while:

<?
$news = array();
$dir = './admin/news';
$handle=opendir($dir);
while (false !== ($file = readdir($handle) AND $i <= 4)) {
    if($file != "." && $file != "..") {
      $news[$file] = filemtime($dir."/".$file) . microtime();
      $i++;
    }
}
closedir($handle);
arsort( $news );
foreach ( $news as $fil => $tid )
{
  echo "<b>". substr(basename($fil), 0, -4) . "</b> - " . date( "d/m-Y H:i:s", $tid ) . "<br>";
  echo "<hr>";
}
?> 

Den laver da også listen, og lister det efter hvornår filerne er oprettet, problemet er bare at nogle filer udebliver :S
Avatar billede erikjacobsen Ekspert
11. april 2006 - 19:14 #13
Du skal i din løkke med readdir læse alle filer, og ikke kun 5. Til gengæld skal du i din udskrift kun udskrive 5.
Avatar billede jakobdo Ekspert
11. april 2006 - 19:25 #14
Jeg lavede en løsning, lidt ala den erik henviser til, og lidt med udgangspunkt i din kode.
Og alligevel ikke! :o)

http://www.codebreaker.dk/exp/702025.php
Avatar billede eds Nybegynder
11. april 2006 - 19:30 #15
Til erikjacobsen, jeg kan ikke få det til at virke, men jeg mener heller ikke at jeg har php 5, kun 4,... :/
Avatar billede erikjacobsen Ekspert
11. april 2006 - 19:46 #16
I det link jeg gav? Det er ikke noget særligt, der er PHP5, men hvorfor bruge PHP4 i disse dage.
Kommentaren 19:14:57 gælder den kode du selv viser, som sagtens kan komme til at virke.
Avatar billede erikjacobsen Ekspert
11. april 2006 - 19:47 #17
jakobdo: Nej, du må ikke bruge tidspunktet som index. Flere filer kan sagtens have samme ændringstidspunkt.
Avatar billede jakobdo Ekspert
11. april 2006 - 19:51 #18
Hvad så med løsningen: $files[filemtime($file) . microtime()] = basename($file,'.php');
Avatar billede erikjacobsen Ekspert
11. april 2006 - 19:59 #19
Nej, så kan du ikke sortere efter tidspunktet.
Avatar billede jakobdo Ekspert
11. april 2006 - 20:28 #20
Ja, så skal man jo en tur forbi klassen du havde i dit eksempel.
Avatar billede erikjacobsen Ekspert
11. april 2006 - 20:37 #21
:)  - eller noget lidt simplere. Bare et  $array[]=Array($filnavn,$tidspunkt);
Avatar billede erikjacobsen Ekspert
11. april 2006 - 21:02 #22
Den simplere udgave ligger på samme link som før.
Avatar billede eds Nybegynder
12. april 2006 - 22:40 #23
Hey erik, din simple udgave fungerer jo perfekt :D
Noget andet jeg nu har fundet ud af er at mine php-evner ikke rækker så langt at jeg kan fjerne filendelsen -_-
Jeg har forsøgt mig med:

<?

  function compare($a,$b) {
    return $b[1]-$a[1];
  }
  $dir='./admin/news'; $max=5;
  $files=Array();
  $f=opendir($dir);
  while (($file=readdir($f))!==false) {
    if($file!="." && $file!=".." && is_file("$dir/$file")) {
      $files[]=Array($file,filemtime("$dir/$file"));
    }
  }
  closedir($f);
  usort($files,"compare");
  $m=min($max,count($files));
  for ($i=0;$i<$m;$i++) {
    print "{ substr(basename($files), 0, -4) [$i][0]}\n";
    echo "<br>";
  }
?>

Men det funger ikke rigtigt :P
Hvis du lige kunne give mig lidt support omkring det ville jeg evigt taknemlig :D
Avatar billede erikjacobsen Ekspert
12. april 2006 - 22:51 #24
Ja, der kunne php godt hjælpe mere til. Jeg tror nok den her fjerner extension:

for ($i=0;$i<$m;$i++) {
  $f=explode('.',$files[$i][0]);
  array_pop($f);
  print join($f,'.')."\n";
}

Og mindre kan gøre det end evig taknemmelighed. Du kunne fx komme og slå vores græsplæne til sommer ;))
Avatar billede coderdk Praktikant
12. april 2006 - 22:56 #25
Du kan også bruge pathinfo til det: http://dk.php.net/pathinfo
Avatar billede eds Nybegynder
12. april 2006 - 23:10 #26
Hehe erik, nu synes jeg liige at du skal tage det roligt, du strammer den en anelse :p
Men i hvert fald mange tak for hjælpen alle sammen :D

Hvis folk lige smider et par svar, så deler jeg pointene :)
Avatar billede erikjacobsen Ekspert
12. april 2006 - 23:15 #27
pathinfo og basename fjerner ikke extension. Men det kan sikkert gøres nemmere end de 3 linier ovenfor.
Avatar billede jakobdo Ekspert
12. april 2006 - 23:29 #28
En smart måde at fjerne filendelsen på kunne være:
$filnavn = "test.php";
$extension = end(explode(".",$filnavn)); //Extension indeholder: php
$file = basename($filnavn,$extension); //File indeholder test
Avatar billede erikjacobsen Ekspert
13. april 2006 - 08:50 #29
Og så skal du lige fjerne et punktum til sidst $file, jakobdo.
Men jeg vil da gerne lige lave en lille ændring til mit forslag (ellers går det galt når der ikke er en ekstension):

for ($i=0;$i<$m;$i++) {
  $f=explode('.',$files[$i][0]);
  if (count($f)>1) array_pop($f);
  print join($f,'.')."\n";
}
Avatar billede jakobdo Ekspert
13. april 2006 - 09:55 #30
Med inspiration fra Erik, så:

$filnavn = "test.php";
$tokens = explode(".",$filnavn);
if(count($tokens)>1)
{
    $extension = end($tokens); //Extension indeholder: php
    $file = basename($filnavn,".".$extension); //File indeholder test
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester