SmileMan's Blogger

19Nov/110

Sortierte Ausgabe von Dateien

Sortierte Ausgabe von Dateien

Der Befehl readdir() von PHP listet den kompletten Inhalt eines Verzeichnisses auf. Auch wenn es in bestimmten Implementierungen von PHP so aussieht, als wäre die Ausgabe entsprechend der "mtime" (Zeit der letzten Modiffikation) sortiert, so gibt es hierbei laut Sprachbeschreibung keine Regel. Man sollte also keinesfalls eine möglicherweise in einer bestimmen Implementierung vorhandene Eigenschaft benutzen. Bei einem Serverwechsel wäre dann zum Beispiel die Sortierreihenfolge anders.

Die Funktion filenames_in_directory($dir, $criteria, &$res, $order="ascending"), die im folgenden aufgelistet ist, gibt ein Array mit den Dateinamen (also nur die Dateinamen und keine Unterverzeichnisse) zurück. Ist der Parameter $order auf ascending gesetzt, werden die Namen in aufsteigender Ordnung sortiert, ansonsten werden sie in absteigender (descending) Sortierung zurückgeliefert.
Mit dem Parameter $criteria kann man bestimmen, ob man eine zeitliche Sortierung, also $criteria="time",  oder eine alphabetische Sortierung, also $criteria="alpha", wünscht.

function filenames_in_directory($dir, $criteria, &$res, $order="ascending") {
$count =0;
$handle=opendir($dir);
while (($file = readdir($handle))!==false) {
/* possible return values for filetype():
fifo, char, dir, block, link, file, unknown */
if (filetype("$dir/$file")=="file") { // no subdirectories e.g.
// "if" makes sure that no subdirectories
// and the directory "." and ".." are listed
if ($criteria == "time") {
$file_time = filemtime("$dir/$file"); // time of last modification
$tfilenames[$file] = $file_time;
} else if ($criteria == "alpha") { // alphabetical listing.
$filenames[$count] = $file;
}
$count++;
}
}
closedir($handle);

$i = 0;
if ($criteria == "time") {
if ($order == "ascending") {
asort($tfilenames);
} else {
arsort($tfilenames);
}
while(list($key, $val) = each($tfilenames)){
$res[$i] = $key;
$i++;
}
}  else if ($criteria == "alpha") {
if ($order == "ascending") {
asort($filenames);
} else {
arsort($filenames);
}
while(list($key, $val) = each($filenames)){
$res[$i] = $val;
$i++;
}
}
return $i;
}

Ein Aufruf des obigen Skriptes sieht wie folgt aus:

$number_of_filenames_in_dir = filenames_in_directory($path, "time", &$files, "ascending");
while(list($key, $file) = each($files)){
echo "$file\n";
}

Dabei werden alle Dateinamen des Unterverzeichnisses $path in zeitlich aufsteigender Reihenfolge ausgedruckt.

EasyFreeAds Blog News Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google Yahoo Buzz StumbleUpon

hat dir dieser Artikel gefallen?

Dann abonniere doch diesen Blog per RSS Feed!

veröffentlicht unter: PHP Kommentar schreiben
Kommentare (0) Trackbacks (0)

Zu diesem Artikel wurden noch keine Kommentare geschrieben.


Leave a comment

Noch keine Trackbacks.