如何自然地分类一个扁平的文件名(有些以数字结尾,例如“ -2”)? 我有一个由文件名组成的PHP阵列,例如: 黑色 蓝色 绿色 橙色 橙色2.png 红色 RED-2.PNG 黄色 黄-2.png 这也是Windows Exp中列表的排序方式...

问题描述 投票:0回答:2

这也是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的完整停止

.
php arrays string sorting filenames
2个回答
3
投票
这就是为什么他们首先被分类的原因:因为

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',
];
输出:


1
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.