字符串比较——PHP的自然比较排序,忽略(但不去掉)非数字数据


string comparison - php natural comparsion sort that ignores (but does not get rid of) non-numeric data

基本上,我有一个包含一堆文件名的目录,我已经将这些文件名加载到数组中。文件名告诉我它们所代表的文本的一些信息(即序言、章节、第二章),但在文件名中我还包括一个序列号,以保持它们的顺序。所以'prollecture1.xml', 'prollecture2.xml', 'prollecture3.xml',…' proflecture12 .xml', 'chapteronelecture13.xml', 'chapteronelecture14.xml'…'conclusionlecture18.xml'等

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

我的问题:是否有一种方法可以获得"自然字符串比较"来忽略文件名的第一部分并从"lecture##"开始?或者更好的情况是,排序是否可以忽略(但不能删除)所有非数字数据,并仅按文件名中嵌入的数字对数组进行排序?

谢谢你的帮助。

我认为没有内置函数可以做到这一点,但使用ussort您可以完成:

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的副本,删除所有非数字字符(我还没有测试过,但我认为它有效)。

您应该编写一个脚本,为您重命名所有文件。不要编写一些hack来克服错误的文件命名。这很可能在将来引起更多的头痛。

应该不难编写这样一个脚本:将小于10的数字重命名为前导0,小于10的数字重命名为两个前导0,10到99之间的数字重命名为一个前导0。

filename001.xmlfilename002.xml