php естественная сортировка, которая игнорирует (но не избавляется) нечисловые данные - PullRequest
0 голосов
/ 29 апреля 2011

По сути, у меня есть каталог с кучей имен файлов, которые я загрузил в массив. Имена файлов кое-что говорят мне о тексте, который они представляют (т.е. Prologue, chapterone, chaptertwo), но в имени файла я также включаю порядковый номер, чтобы упорядочить их. Так что «prollecture1.xml», «prollecture2.xml», «prollecture3.xml»,. , , 'prollecture12.xml', 'chapteronelecture13.xml', 'chapteronelecture14.xml'. , , заключение_1818.xml и т. д.

Я хочу отсортировать это так, чтобы массив перечислял их в числовом порядке. Использование «естественной сортировки сравнения» приближает меня, но сортировка начинается с первого символа имени файла, и, таким образом, «chapteronelecture13.xml» отображается перед «prollecture1.xml», потому что «c» предшествует «p». Если бы я знал, что хочу сделать это с самого начала, я бы поставил цифры на первое место. Но изменить все имена файлов сейчас было бы много работы.

Мой вопрос: есть ли способ получить "естественное сравнение строк", чтобы проигнорировать первую часть имени файла и начать с "лекции ##"? Или, что еще лучше, может ли сортировка игнорировать (но не удалять) все нечисловые данные и сортировать массив исключительно по числам, встроенным в имя файла?

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2011

Вы должны написать скрипт, который переименует все файлы для вас.Не пишите взломать, чтобы преодолеть неправильное именование файлов.Это, скорее всего, вызовет еще больше головной боли в будущем.

Не составит труда написать сценарий, который переименует файлы с начальным 0 для чисел меньше 10 или даже с двумя ведущими нулями для чисел меньше10, и один ведущий ноль для чисел от 10 до 99.

filename001.xml filename002.xml

Тогда ваш вид будет работать идеально.

0 голосов
/ 29 апреля 2011

Я думаю, что нет встроенной функции, которая делает это, но, используя usort , вы можете достичь этого:

function just_numerical_sort($a, $b)
{
    return preg_replace('/[^0-9]/', '', $a) - preg_replace('/[^0-9]/', '', $b);
}

usort($array, 'just_numerical_sort');

preg_replace возвращает копию $ a или $b со всеми удаленными нечисловыми символами (я не проверял это, но я думаю, что это работает).

...