我有一个使用DirectoryIterator获取的文件名数组。我试图让文件名进行排序,以便它们按顺序排列,这就是它们在服务器上的显示方式。
2DAYSALEGATE_PG1.jpg 2DAYSALEGATE_PG2.jpg 722_PG1.jpg PW_PG2_COKE_A.jpg PW_PG3_COKE_A.jpg PWBY4_DELI-1.jpg
当获取文件名时,他们会这样出来。我试过使用sort,natsort和natcasesort。在字母后面考虑下划线字符的文件名。我该怎么做才能将下划线排序为优先级字符。
array(6) {
[0]=>
string(20) "2DAYSALEGATE_PG1.jpg"
[1]=>
string(20) "2DAYSALEGATE_PG2.jpg"
[2]=>
string(11) "722_PG1.jpg"
[5]=>
string(16) "PWBY4_DELI-1.jpg"
[3]=>
string(17) "PW_PG2_COKE_A.jpg"
[4]=>
string(17) "PW_PG3_COKE_A.jpg"
}
由于
答案 0 :(得分:6)
您可以使用php usort
方法,查看here
使用usort
,您可以实现自定义compare to
函数并根据它对数组进行排序。
自定义compare to
函数为int callback ( mixed $a, mixed $b )
,如果$a < $b
,则应返回小于0的值,如果相等则返回0,如果$a > $b
则返回大于0的值
使用此方法实现您首选的排序顺序
示例:
function cmp($a, $b) {
$aTemp = str_replace('_', '0', $a);
$bTemp = str_replace('_', '0', $b);
return strcmp($aTemp,$bTemp);
}
usort($arr, "cmp");
答案 1 :(得分:2)
不确定你能在这做什么。从字面上看,下划线的ASCII值高于任何字母数字字符。
用\ x01之类的低ASCII值替换下划线,然后排序,然后用下划线替换低ASCII值,将得到你想要的结果,但这对于按顺序改变来说似乎相当昂贵。
答案 2 :(得分:0)
尝试使用
for(i=0;i<array(6).length;i++){
if (array(6).charAt(0)=='_'){
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}}}}}
答案 3 :(得分:0)
一个简单的技巧是:
// Fix sorting issues with Upper Case and underscore
$arr = array_change_key_case($arr, CASE_LOWER);
// sort keys alphabetically:
ksort($arr);
// Put them back to UPPER
$arr = array_change_key_case($arr, CASE_UPPER);
排序时大写下划线权重较小,会在后面。