这也是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”结尾的fileNames - 我想避免的。
我已经尝试使用以相同结果使用natsort()
连字符字符-
是ASCII字符2D,并且在字符集中的所有数字和字母领先。更重要的是,它也直接出现在2e的完整停止
.
sort()
认为字符是相同的,然后将
yellow
与
-
进行比较,然后将.
首先放置。如果您的所有字符都具有相同的文件扩展名,则可以通过简单地对基本文件名上的文件进行排序,即从所有这些末尾删除
-
.png
。这将意味着yellow
在yellow-2
之前进行排序。如果需要,可以在排序后替换扩展。
其他选项是为连字符使用其他字符。下划线角色位于ASCII表的末端,因此即使将文件扩展保持在适当的位置,也将按照您想要的方式进行排序。
natsort()
(正如您在问题中所指出的那样)不起作用,因为连字符被视为负面。因此,
yellow.png
被视为零项目,并且
yellow-2.png
被视为项目负2,因此首先被分类。同样,使用下划线而不是连字符可以在这里提供帮助。或者您根本无法使用分隔符字符。如果您绝对不想更改文件名,那么您的最终选项是使用
usort()
写下排序。这将允许您编写比较项目以确定哪些分类更高或更低的功能。在这种情况下,例如,您仍然可以用下划线替换连字符,然后进行排序,但仅在
usort()
函数的上下文中;字符串替换只会影响该fucntion中的本地变量,因此您在主代码中的实际文件名将保持不变。
您不需要突变您要排序的实际数组,您可以自然地对临时数组进行排序,并具有原始数组中表示的位置更改。 demo
array_multisort(
str_replace('-', '_', $array),
SORT_ASC,
SORT_NATURAL,
$array
);
var_export($array);
延伸测试输入:
$array = [
'yellow-2.png',
'blue.png',
'orange.png',
'green.png',
'orange-2.png',
'red-2.png',
'black.png',
'yellow.png',
'orange-11.png',
'red.png',
];
输出: