Hallo,
Lohnt es sich hier eigentlich aus Performance-Gründen opendir() mit readdir() statt scan() zu verwenden? Denn die implizite Sortierung von scan() wird hier ja nicht gebraucht.
Du kannst sie aber ausnutzen :-)
Ausgehend von Deinem Beispiel:
Array
(
[0] => musik.mp3
[1] => bild.jpg
[2] => mehr_musik.mp3
[3] => noch_ein_bild.jpg
[4] => text.txt
[5] => textdokument.doc
)
hast Du nun festgestellt, dass die Reihenfolge durch scandir() wie folgt aussieht:
Array
(
[0] => bild.jpg
[1] => mehr_musik.mp3
[2] => musik.mp3
[3] => noch_ein_bild.jpg
[4] => textdokument.doc
[5] => text.txt
)
Bei einer Handvoll von Einträgen ist Performance eh' völlig gleichgültig, aber bei vielen Einträgen kann ein anderes Verfahren schneller sein.
Hier das alternative Verfahren als Pseudocode.
Dabei werden die Dateinamen als assoziatives Array abgelegt. Als Schlüssel werden die Dateiendungen verwendet und die Werte sind wiederum ein Array, das die Dateinamen mit der entsprechenden Endung enthält.
das heißt bei Deinem Beispiel sieht das Resultat wie folgt aus:
Array (
'jpg' => Array (
'bild.jpg',
'noch_ein_bild.jpg'
),
'mp3' => Array (
'mehr_musik.mp3',
'musik.mp3'
),
'doc' => Array (
'textdokument.doc'
),
'txt' => Array (
'text.txt'
)
)
Nun muss man dieses Array nur noch nach den Schlüsseln sortieren, z.B. mit ksort und anschließend die einzelnen Arrays mit sort sortieren. Wenn wir jedoch ausnutzen, dass scandir() eine sortierte Liste erzeugt, so sind die inneren Arrays durch das linearen Abarbeiten der sortierten Liste automatisch ebenfalls sortiert :-)
Algorithmus:
Lege ein leeres Resultatarray an
Für jeden Dateinamen in der alphabetisch sortierten Dateinamenliste
Bestimme die Dateiendung des Dateinamens
Wenn die Dateiendung noch nicht als Schlüssel im Resultatarray existiert
Lege einen Eintrag der Form (Dateiendung => leeres Array) an
Ende Wenn
Hänge den Dateinamen an das passende Array an.
Ende Für
Sortiere das Resultatarray aufsteigend nach den Schlüsseln
Die Ausgabe dieser Datenstruktur ist einfacher, weil der Gruppenwechsel automatisch eingebaut ist:
Für jedes Element im Resultatarray
Schreibe eine Überschrift mit dem Schlüssel
Schreibe den Listenanfang
Für jeden Dateinamen im Wertearray
Schreibe ein Listenelement
Ende Für
Schreibe das Listenende
Ende Für
Wäre die Ausgangsliste nicht vorsortiert, so müsstest Du nur zwischen Aufbau des Arrays von Arrays die Einzelarrays sortieren:
Für jedes Element im Resultatarray
Sortiere das Wertearray
Ende Für
Implementiere alle Verfahren und ermittle die Laufzeit bei unterschiedlichen Ausgangsdaten :-)
Freundliche Grüße
Vinzenz