Zur Navigation

Dateien sortieren

1 uwe

Hallo,
ich lese die Dateien im Verzeichnis mit folgendem Sript aus.

Jetzt will ich aber die Sortierung alphabetisch richtig darstellen.
Also immer alle aA und bB hintereinander.
Das soll mit natsort gehen.

Wie macht man das?

Zweite Frage:
Über ein Button will ich das gleiche Script noch einmal aufrufen aber nach Dateigröße sortiert.

Gruss
Uwe
<?php

function Dateigroesse($URL)
{
  $Groesse = filesize($URL);
  if($Groesse < 1000){
    return " ".number_format($Groesse, 0, ",", ".")." Bytes";
  }
  elseif($Groesse < 1000000){
    return " ".number_format($Groesse/1024, 0, ",", ".")." kB";
  }
  else{
    return " ".number_format($Groesse/1048576, 2, ",", ".")." MB";
  }
}

function DateCmp($a, $b)
{
  if ($a[1] == $b[1]) {
    return 0;
  }
  return ($a[1] < $b[1]) ? -1 : 1;
}

$dir = 'uploads/';

$files = array();
$fp = opendir($dir);
  
while (false !== ($file = readdir($fp)))
{
  if ($file == '.' || $file == '..' || $file == 'thumb' || $file == 'Thumbs.db')
   continue;
  
  $files[] = array($file, filemtime($dir.$file), Dateigroesse($dir.$file));
}

closedir($fp);


// vorwärts sortiert Datum usort($files, 'DateCmp');
sort($file);

echo '<table  cellpadding="0" class="table">
   <tr>
     <td class="list_top">Name</td>
     <td class="list_top">Größe</td>
     <td class="list_top">Hochgeladen</td>
     <td class="list_top"></td>
   </tr>';

foreach ($files as $entry) {
    echo '<tr>
     <td class="list_main">' . $entry[0] . '</td>
     <td class="list_main">' . $entry[2] . '</td>
     <td class="list_main">' . date ('H:i:s - d.m.y', $entry [1]) . '</td>
     <td class="list_main"><a href="' . $dir . $entry[0] . '" target="_blank"><img src="icon.gif" border="no"/></a></td>
  </tr>';
}

echo '</table>';

?>

16.08.2008 20:46

2 Jörg

Hallo Uwe,

schau dir mal die Funktion array_multisort() an (insbesondere Beispiel #3) - mit welcher mehrdimensionale Arrays wie $files sortiert werden können. Damit solltest du nach verschiedenen Schlüsseln sortieren können, wie z.B. Dateinamen und Dateigröße.

16.08.2008 21:18

3 uwe

Hallo,
danke für den Hinweis.
Ich habe versucht das einzubauen. Aber es passiert nichts.
(wird bei diesem Sortieren auch das Alphabet richtig dargestellt?
NICHT erst alle Grossen Buchstaben und dann die Kleinen)

<?php

function Dateigroesse($URL)
{
  $Groesse = filesize($URL);
  if($Groesse < 1000){
    return " ".number_format($Groesse, 0, ",", ".")." Bytes";
  }
  elseif($Groesse < 1000000){
    return " ".number_format($Groesse/1024, 0, ",", ".")." kB";
  }
  else{
    return " ".number_format($Groesse/1048576, 2, ",", ".")." MB";
  }
}



$dir = 'uploads/';

$files = array();
$fp = opendir($dir);
  
while (false !== ($file = readdir($fp)))
{
  if ($file == '.' || $file == '..' || $file == 'thumb' || $file == 'Thumbs.db')
   continue;
  
  $files[] = array($file, filemtime($dir.$file), Dateigroesse($dir.$file));
}

closedir($fp);


// vorwärts sortiert Datum usort($files, 'DateCmp');
//sort($files, $file);

foreach ($files as $key => $row) {
    $fname[$key]  = $row['fname'];
    $fdatum[$key] = $row['fdatum'];
 $fgroesse[$key] = $row['fgroesse'];
}

// Die Daten mit fgroesse, fname  sortieren
// Geben Sie $files als letzten Parameter an, um nach dem gemeinsamen
// Schlüssel zu sortieren.
//array_multisort($fname, SORT_ASC, $fdatum, SORT_ASC, $fgroesse, SORT_DESC, $files);
array_multisort($fgroesse, SORT_DESC, $fname, SORT_ASC, $fdatum, SORT_ASC, $files);



echo '<table  cellpadding="0" class="table">
   <tr>
     <td class="list_top">Name</td>
     <td class="list_top">Größe</td>
     <td class="list_top">Hochgeladen</td>
     <td class="list_top"></td>
   </tr>';

foreach ($files as $entry) {
    echo '<tr>
     <td class="list_main">' . $entry[0] . '</td>
     <td class="list_main">' . $entry[2] . '</td>
     <td class="list_main">' . date ('H:i:s - d.m.y', $entry [1]) . '</td>
     <td class="list_main"><a href="' . $dir . $entry[0] . '" target="_blank"><img src="icon.gif" border="no"/></a></td>
  </tr>';
}

echo '</table>';

?>

16.08.2008 22:38

4 Jörg

Du benötigst noch die Schlüsselnamen im Array $files

while (false !== ($file = readdir($fp)))
{

/* etc. */

$files[] = array('fname' => $file, 'fdatum' => filemtime($dir.$file), 'fgroesse' => Dateigroesse($dir.$file));

}

Entsprechend sollten diese auch später noch verwendet werden anstelle der Indizes 0 bis 2:

foreach ($files as $entry) {
    echo '<tr>
     <td class="list_main">' . $entry['fname'] . '</td>
     <!-- etc. -->
}

(wird bei diesem Sortieren auch das Alphabet richtig dargestellt?
NICHT erst alle Grossen Buchstaben und dann die Kleinen)

In "Beispiel #4 Groß-/Kleinschreibung nicht beachtende Sortierung" wird hierzu ein Lösungsweg aufgezeigt

17.08.2008 00:01 | geändert: 17.08.2008 00:03

5 uwe

Hallo Jörg,
besten Dank.

Schönen Tag noch

Gruss
Uwe

17.08.2008 07:33

Beitrag schreiben (als Gast)





[BBCode-Hilfe]