php自然比较排序忽略(但没有摆脱)非数字数据

时间:2011-04-29 13:09:37

标签: php string-comparison sorting

基本上,我有一个目录,其中包含一些我已加载到数组中的文件名。文件名告诉我他们所代表的文本(即Prologue,chapterone,chaptertwo),但在文件名中我还包括一个序列号以保持它们的顺序。所以'prollecture1.xml','prollecture2.xml','prollecture3.xml',. 。 。 'prollecture12.xml','chapteronelecture13.xml','chapteronelecture14.xml'。 。 。 'resullecture18.xml'等。

我想对此进行排序,以便数组按数字顺序列出它们。使用“自然比较排序”让我接近,但排序从文件名的第一个字符开始,因此'chapteronelecture13.xml'列在'prollecture1.xml'之前,因为'c'在'p'之前。如果我知道我想从一开始就这样做,我会把数字放在第一位。但是现在更改所有文件名将是很多工作。

我的问题:有没有办法让“自然字符串比较”忽略文件名的第一部分并从“讲座##”开始?或者更好的是,排序是否可以忽略(但不删除)所有非数字数据,并仅通过文件名中嵌入的数字对数组进行排序?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我认为没有内置函数可以做到这一点,但是使用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的副本,删除了所有非数字字符(我没有测试过,但我认为它有效)。

答案 1 :(得分:0)

您应该编写一个脚本,为您重命名所有文件。不要写一些黑客来克服错误的文件命名。这最有可能导致未来更多的麻烦。

编写一个重命名文件的脚本,对于数字小于10的数字,使用前导0重命名,或者对于小于10的数字,甚至是两个前导零,并且对于10到99之间的数字,前导零为零。 / p>

filename001.xml filename002.xml

然后你的排序将完美无缺。