строка — как естественным образом отсортировать список файлов (некоторые заканчиваются цифрами, например, «-2») в переполнении стека

У меня есть массив 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 () с тем же результатом.

Есть идеи?

3

Решение

Символ дефиса - является ASCII-символом 2D и идет впереди всех цифр и букв в наборе символов. Что еще более важно, это также происходит непосредственно перед полной остановкой . персонаж, который 2E.

Вот почему они сортируются в первую очередь: потому что sort() видит персонажей yellow как то же самое, а затем сравнивает - с . и ставит - первый.

Если все ваши символы имеют одинаковое расширение файла, вы можете решить эту проблему, просто отсортировав файлы по базовому имени файла — т.е. удалите .png с конца всех из них. Это будет означать, что yellow сортируется впереди yellow-2, Вы можете заменить расширения после сортировки, если вам нужно.

Другой вариант — использовать другой символ для дефиса. Символ подчеркивания расположен в конце таблицы ASCII и, таким образом, будет отсортирован так, как вы хотите, даже если вы сохраните расширения файлов на месте.

natsort() не работает (как вы отметили в вопросе), потому что дефис рассматривается как отрицательный. Так yellow.png рассматривается как нулевой элемент, и yellow-2.png обрабатывается как отрицательный элемент два, и поэтому сортируется первым. Опять же, использование подчеркивания, а не дефиса может помочь здесь. Или вы можете просто не использовать символ разделителя вообще.

Если вы абсолютно не хотите изменять имена файлов, последний вариант — написать сортировку самостоятельно, используя usort(), Это позволит вам написать функцию, которая сравнивает элементы, чтобы решить, какая сортируется выше или ниже. В этом случае вы можете, например, все еще заменить дефисы подчеркиванием, а затем выполнить сортировку, но только в контексте usort() функция; замена строки будет влиять только на локальные переменные в этой функции, поэтому ваши действительные имена файлов в вашем основном коде останутся нетронутыми.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]