Dateien nach Datum sortieren

hank_php

Grünschnabel
Ich möchte die Dateien eines Ordners auslesen und als Links ausgeben. Diese Liste soll nach dem Datum sortiert sein. Die Files lauten "dd.mm.yy dateiname.txt". Sortiert werden soll also nach dem im Filenamen enthaltenem Datum. Ich hatte es so versucht:

PHP:
$i=0;

$pfad="/";
$verz=opendir ($pfad);

while ($file=readdir($verz))
{$afile[]=$file;}

closedir($verz);

sort($afile);

$anz=count($afile);

for($i=0;$i<$anz;$i++)
	{
	$utf = utf8_encode($afile[$i]);
	$link = rawurlencode($afile[$i]);
	echo '<li><a href="';
	echo $pfad.$link;
	echo '" class="link">';
	echo str_replace(".txt", "", $utf);
	echo '</a></li>';
	}

Führt bisher zu:

* 01.11.08 Test.txt
* 11.01.09 Test.txt
* 21.10.08 Test.txt
* 22.10.08 Test.txt

Ist so natürlich nicht richtig. Hat jemand ne Idee wie ich die Files korrekt sortieren lassen kann?
 
PHP:
$str = array();
$str[] = '01.11.08 Test.txt';
$str[] = '11.01.09 Test.txt';
$str[] = '21.10.08 Test.txt';
$str[] = '22.10.08 Test.txt';

$files = array();
foreach( $str as $key => $var )
{
    $tmp = explode( ' ', $var );
    $files[] = array( 'date' => strtotime( $tmp[0] ), 'name' => $tmp[1] );
}

asort( $files );

var_dump( $files );
Sollte das Leerzeichen, anhand dem ich den Dateinamen auseinander nehme so nicht existieren (ich gehe aber davon aus, da du das so gepostet hast), müsstest du dir mit einem Regulärem Ausdruck weiterhelfen, um obiges zu erreichen.

Man kann vielleicht noch was schöneres machen mit filemtime().
 
Hey danke Loomes für Deinen entscheidenden Hinweis.

strtotime hat bei mir das Datum nicht umrechnen können - das Ergebnis war immer 1970. Ich habe das Datum dann einfach neu aufgebaut und eine insgesamt funktionierende Lösung zusammengeklebt:

PHP:
$i=0;
$pfad="pfad/";
$verz=opendir ($pfad);
while ($file=readdir($verz))
 { 
   if (is_dir($file)||$file=="diesedateinicht.txt")
    {}
    else
    {$afile[]=$file;}
  }
closedir($verz);
$files = array();
foreach( $afile as $key => $var )
  {
    $tmp = explode( ' ', $var );
    $date = explode ('.', $tmp[0]);
    $datum = date("Y/m/d",mktime(0,0,0,$date[1],$date[0],$date[2]));
    $files[] = array( 'date' => strtotime($datum), 'name' => str_replace($tmp[0]." ","", $var) );
  }

asort( $files );

$anz=count($files);
for($i=0;$i<$anz;$i++)
  {
    $datei = $files[$i];
    $link = rawurlencode(strftime("%d.%m.%Y ",$datei['date']).$datei['name']);
    echo '<li><a href="';
    echo $pfad.$link;
    echo '" class="link">';
    echo strftime("%d.%m.%Y ", $datei['date']);
    echo $datei['name'];
    echo '</a></li>';
  }

Leider sind meine PHP Kenntnisse minimal. Ich wage also zu bezweifeln das dieser Code schon das non plus ultra ist.
 
Hi,
es gibt eigendlich immer etwas zu verbessern.
So schlecht sieht dein Code doch garnicht aus, da haben wir hier schon schlimmeres gesehen. :)

/e: Den leeren if-Block in der ersten while-Schleife könntest du beispielsweise überdenken.
 
Zurück