scandir - сортировать числовые имена файлов

Сделал некоторые поиски, но не могу найти точный ответ, который я ищу.

Я хотел бы получить файлы с пронумерованными именами файлов, используя «scandir ($ dir)», но правильно отсортировать их. Например, имена файлов:

1-something.ext

2-something-else.ext

3-a-third-name.ext

.

.

.

10-another-thing.ext

11-more-names.ext

У меня проблема в том, что 10-a-fourth-thing.ext будет отображаться перед 2-something-else.ext. Я хотел бы найти лучший способ решения этой проблемы, чем введение ведущего «0» перед всеми именами файлов.

Какие-нибудь мысли? Спасибо.


person Phil    schedule 15.03.2012    source источник


Ответы (3)


natsort делает именно то, что вам нужно.

sort с SORT_NUMERIC также будет работать с именами файлов, начинающимися с цифр, но не будет работать, если есть также имена без цифр в начале (все имена без префикса с цифрой будут сортироваться перед именами с префиксом с цифрой, и их порядок относительно друг друга будут случайными, а не алфавитными).

person Jon    schedule 15.03.2012

Вы можете использовать сортировку следующим образом:

sort($arr, SORT_NUMERIC); // asuming $arr is your array
person anubhava    schedule 15.03.2012
comment
Это тоже был мой первый порыв, но с ним есть серьезные проблемы. - person Jon; 16.03.2012
comment
Из OP I'd like to pull in files with numbered filenames видно, что имена файлов всегда имеют цифры впереди. Однако, если есть смешанные, то нацсорт - это путь. - person anubhava; 16.03.2012

Если вы хотите переназначить ключи (чего не делает natsort), используйте usort() в сочетании с strnatcmp() или strnatcasecmp():

usort($arr, 'strnatcmp'); // Or 'strnatcasecmp' for case insensitive
person RussSchick    schedule 26.03.2012