2016-06-13 17 views
3

排序文件(有些结尾用数字,例如“-2”)的列表,我有一个PHP阵列,其中包括文件名,如:如何自然在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()具有相同的结果。

任何想法?

回答

2

连字符-是ASCII字符2D,并且超出了字符集中的所有数字和字母。更重要的是,它也是在即将完成的.字符之前,即2E。

这就是为什么他们被赢取话费:因为sort()看到的字符yellow为相同,然后用.并提出-首先比较-

如果所有的字符都具有相同的文件扩展名,您可以通过简单地对基文件名中的文件进行排序来解决此问题 - 即从所有字符的末尾删除.png。这意味着yellow会先于yellow-2排序。如果需要,可以在排序后替换扩展名。

另一种选择是对连字符使用不同的字符。下划线字符位于ASCII表格的末尾,因此即使将文件扩展名保留在原位,也会按照您希望的方式进行排序。

natsort()不起作用(正如您在问题中指出的那样),因为连字符被视为负数。所以yellow.png被视为项目零,yellow-2.png被视为项目负两,因此排序第一。同样,使用下划线而不是连字符可以在这里帮助。或者你完全可以根本不使用分隔符。

如果您绝对不想更改文件名,您的最终选择是使用usort()自己编写排序。这将允许您编写比较项目的函数,以决定哪些排序更高或更低。在这种情况下,例如,您仍然可以用下划线替换连字符,然后进行排序,但只能在usort()函数的上下文中进行排序;字符串替换只会影响该函数中的局部变量,所以您的主代码中的实际文件名将保持不变。

+0

感谢您的提示!现在我只是将它们重命名为“_2”,它的工作原理! :) – Stephan