У меня есть массив PHP, состоящий из имен файлов, например:
black.png
blue.png
green.png
orange.png
orange-2.png
red.png
red-2.png
yellow.png
yellow-2.png
Это также, как список сортируется в проводнике Windows (и как он должен выглядеть в конце). Когда я читаю каталог в PHP и выводить список с помощью Сортировать() Я получаю следующее:
black.png
blue.png
green.png
orange-2.png
orange.png
red-2.png
red.png
yellow-2.png
yellow.png
Имена файлов, заканчивающиеся на «-2», показываются первыми — чего я бы хотел избежать.
Я уже пробовал использовать natsort () с тем же результатом.
Есть идеи?
Символ дефиса -
является ASCII-символом 2D и идет впереди всех цифр и букв в наборе символов. Что еще более важно, это также происходит непосредственно перед полной остановкой .
персонаж, который 2E.
Вот почему они сортируются в первую очередь: потому что sort()
видит персонажей yellow
как то же самое, а затем сравнивает -
с .
и ставит -
первый.
Если все ваши символы имеют одинаковое расширение файла, вы можете решить эту проблему, просто отсортировав файлы по базовому имени файла — т.е. удалите .png
с конца всех из них. Это будет означать, что yellow
сортируется впереди yellow-2
, Вы можете заменить расширения после сортировки, если вам нужно.
Другой вариант — использовать другой символ для дефиса. Символ подчеркивания расположен в конце таблицы ASCII и, таким образом, будет отсортирован так, как вы хотите, даже если вы сохраните расширения файлов на месте.
natsort()
не работает (как вы отметили в вопросе), потому что дефис рассматривается как отрицательный. Так yellow.png
рассматривается как нулевой элемент, и yellow-2.png
обрабатывается как отрицательный элемент два, и поэтому сортируется первым. Опять же, использование подчеркивания, а не дефиса может помочь здесь. Или вы можете просто не использовать символ разделителя вообще.
Если вы абсолютно не хотите изменять имена файлов, последний вариант — написать сортировку самостоятельно, используя usort()
, Это позволит вам написать функцию, которая сравнивает элементы, чтобы решить, какая сортируется выше или ниже. В этом случае вы можете, например, все еще заменить дефисы подчеркиванием, а затем выполнить сортировку, но только в контексте usort()
функция; замена строки будет влиять только на локальные переменные в этой функции, поэтому ваши действительные имена файлов в вашем основном коде останутся нетронутыми.
Других решений пока нет …