2016-06-13 13 views
3

ich einen PHP-Array habe von Dateinamen aus, wie:Wie man natürlich eine Liste von Dateien (einige endend mit Zahlen, zB „-2“) sortiert in PHP

black.png 
blue.png 
green.png 
orange.png 
orange-2.png 
red.png 
red-2.png 
yellow.png 
yellow-2.png 

Dies ist auch, wie die Liste ist im Windows Explorer sortiert (und wie es am Ende aussehen sollte). Wenn ich das Verzeichnis in PHP und Ausgabe die Liste mit Art lesen() ich folgenden erhalten:

black.png 
blue.png 
green.png 
orange-2.png 
orange.png 
red-2.png 
red.png 
yellow-2.png 
yellow.png 

Dateinamen mit der Endung „-2“ werden zuerst angezeigt - was ich vermeiden möchte. Ich habe bereits versucht natsort() mit dem gleichen Ergebnis zu verwenden.

Irgendwelche Ideen?

Antwort

2

Das Bindestrichzeichen - ist das ASCII-Zeichen 2D und steht vor allen Zahlen und Buchstaben im Zeichensatz. Noch wichtiger ist, es kommt auch unmittelbar vor dem Punkt . Zeichen, die 2E ist. Diese

Deshalb sind sie zuerst sortiert werden: weil sort() die Zeichen sieht yellow als die gleiche ist, und vergleicht dann - mit . und Puts - zuerst.

Wenn alle Ihre Charaktere die gleiche Dateierweiterung haben, können Sie dies lösen, indem Sie einfach die Dateien nach dem Basisdateinamen sortieren - dh entfernen Sie die .png vom Ende von allen. Dies bedeutet, dass yellow vor yellow-2 sortiert wird. Sie können die Erweiterungen nach dem Sortieren bei Bedarf ersetzen.

Eine andere Option wäre, ein anderes Zeichen für den Bindestrich zu verwenden. Das Unterstreichungszeichen befindet sich am Ende der ASCII-Tabelle und wird daher so sortiert, wie Sie möchten, auch wenn Sie die Dateierweiterungen beibehalten.

natsort() funktioniert nicht (wie Sie in der Frage bemerkt haben), weil der Bindestrich als negativ angesehen wird. So wird yellow.png als Element Null behandelt und yellow-2.png wird als Element minus zwei behandelt und wird daher zuerst sortiert. Auch hier könnte die Verwendung von Unterstrich anstelle von Bindestrich hilfreich sein. Oder Sie könnten einfach kein Trennzeichen verwenden.

Wenn Sie die Dateinamen absolut nicht ändern möchten, besteht Ihre letzte Option darin, die Sortierung selbst mit usort() zu schreiben. Dies ermöglicht es Ihnen, die Funktion zu schreiben, die Elemente vergleicht, um zu entscheiden, welche höher oder niedriger sortiert ist. In diesem Fall könnten Sie beispielsweise die Bindestriche immer noch durch Unterstriche ersetzen und dann die Sortierung durchführen, jedoch nur im Rahmen der usort() Funktion; Der String-Ersetzung würde nur die lokalen Variablen in dieser Funktion beeinflussen, so dass Ihre tatsächlichen Dateinamen in Ihrem Hauptcode unberührt bleiben würden.

+0

Danke für den Hinweis! Jetzt habe ich sie in "_2" umbenannt und es funktioniert! :) – Stephan