如何自然地对 PHP 中的文件列表(一些以数字结尾,例如“-2”)进行排序
How to naturally sort a list of files (some ending with numbers, e.g. "-2") in PHP
我有一个由文件名组成的 PHP 数组,例如:
black.png
blue.png
green.png
orange.png
orange-2.png
red.png
red-2.png
yellow.png
yellow-2.png
这也是列表在 Windows Explorer 中的排序方式(以及它最终应该是什么样子)。当我读取 PHP 中的目录并使用 sort() 输出列表时,我得到以下信息:
black.png
blue.png
green.png
orange-2.png
orange.png
red-2.png
red.png
yellow-2.png
yellow.png
首先显示以“-2”结尾的文件名——这是我想避免的。
我已经尝试使用 natsort() 得到相同的结果。
有什么想法吗?
连字符-
是二维ASCII字符,在字符集中排在所有数字和字母之前。更重要的是,它也紧接在句号 .
字符之前,即 2E.
这就是为什么它们首先被排序的原因:因为 sort()
认为字符 yellow
相同,然后将 -
与 .
进行比较并放入-
第一。
如果你所有的角色都有相同的文件扩展名,你可以通过简单地根据基本文件名对文件进行排序来解决这个问题——即从所有文件的末尾删除 .png
。这意味着 yellow
排在 yellow-2
之前。如果需要,您可以在排序后替换扩展名。
另一种选择是对连字符使用不同的字符。下划线字符位于 ASCII table 的末尾,因此将按您想要的方式排序,即使您保留文件扩展名也是如此。
natsort()
不起作用(正如您在问题中指出的那样),因为连字符被视为否定。所以yellow.png
被当做第0项,而yellow-2.png
被当做负二项,因此排在最前面。同样,使用下划线而不是连字符在这里会有所帮助。或者您可以根本不使用分隔符。
如果您绝对不想更改文件名,最后的选择是使用 usort()
自己编写排序。这将允许您编写比较项目以确定哪个排序更高或更低的函数。在这种情况下,您仍然可以用下划线替换连字符,然后进行排序,但只能在 usort()
函数的上下文中;字符串替换只会影响该函数中的局部变量,因此您在主代码中的实际文件名将保持不变。
我有一个由文件名组成的 PHP 数组,例如:
black.png
blue.png
green.png
orange.png
orange-2.png
red.png
red-2.png
yellow.png
yellow-2.png
这也是列表在 Windows Explorer 中的排序方式(以及它最终应该是什么样子)。当我读取 PHP 中的目录并使用 sort() 输出列表时,我得到以下信息:
black.png
blue.png
green.png
orange-2.png
orange.png
red-2.png
red.png
yellow-2.png
yellow.png
首先显示以“-2”结尾的文件名——这是我想避免的。 我已经尝试使用 natsort() 得到相同的结果。
有什么想法吗?
连字符-
是二维ASCII字符,在字符集中排在所有数字和字母之前。更重要的是,它也紧接在句号 .
字符之前,即 2E.
这就是为什么它们首先被排序的原因:因为 sort()
认为字符 yellow
相同,然后将 -
与 .
进行比较并放入-
第一。
如果你所有的角色都有相同的文件扩展名,你可以通过简单地根据基本文件名对文件进行排序来解决这个问题——即从所有文件的末尾删除 .png
。这意味着 yellow
排在 yellow-2
之前。如果需要,您可以在排序后替换扩展名。
另一种选择是对连字符使用不同的字符。下划线字符位于 ASCII table 的末尾,因此将按您想要的方式排序,即使您保留文件扩展名也是如此。
natsort()
不起作用(正如您在问题中指出的那样),因为连字符被视为否定。所以yellow.png
被当做第0项,而yellow-2.png
被当做负二项,因此排在最前面。同样,使用下划线而不是连字符在这里会有所帮助。或者您可以根本不使用分隔符。
如果您绝对不想更改文件名,最后的选择是使用 usort()
自己编写排序。这将允许您编写比较项目以确定哪个排序更高或更低的函数。在这种情况下,您仍然可以用下划线替换连字符,然后进行排序,但只能在 usort()
函数的上下文中;字符串替换只会影响该函数中的局部变量,因此您在主代码中的实际文件名将保持不变。