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.
Danke für den Hinweis! Jetzt habe ich sie in "_2" umbenannt und es funktioniert! :) – Stephan