php - 仅使用数字、数字字母、字母数字和字母的组合对数组进行排序
问题描述
我正在尝试排序和排列,但是无法按预期获得数组。
我有一个像这样的数组:
Array
(
[0] => 5
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 11
[6] => 12
[7] => 13
[8] => 14
[9] => 15
[10] => 16
[11] => 17
[12] => 18
[13] => 19
[14] => 20
[15] => 21
[16] => 23
[17] => 24
[18] => 26
[19] => 28
[20] => 29
[21] => 30
[22] => 31
[23] => 32
[24] => 33
[25] => 34
[26] => 35
[27] => 36
[28] => 37
[29] => 38
[30] => 39
[31] => 40
[32] => 41
[33] => 42
[34] => 44
[35] => 46
[36] => 48
[37] => 50
[38] => 52
[39] => 54
[40] => A
[41] => B
[42] => 3
[43] => 4
[44] => 6
[45] => A1
[46] => B1
[47] => 1A
[48] => 22
[49] => 25
[50] => 27
[51] => 1B
)
当我运行 asort($arr) 它返回:
Array
(
[47] => 1A
[51] => 1B
[42] => 3
[43] => 4
[0] => 5
[44] => 6
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 11
[6] => 12
[7] => 13
[8] => 14
[9] => 15
[10] => 16
[11] => 17
[12] => 18
[13] => 19
[14] => 20
[15] => 21
[48] => 22
[16] => 23
[17] => 24
[49] => 25
[18] => 26
[50] => 27
[19] => 28
[20] => 29
[21] => 30
[22] => 31
[23] => 32
[24] => 33
[25] => 34
[26] => 35
[27] => 36
[28] => 37
[29] => 38
[30] => 39
[31] => 40
[32] => 41
[33] => 42
[34] => 44
[35] => 46
[36] => 48
[37] => 50
[38] => 52
[39] => 54
[40] => A
[45] => A1
[41] => B
[46] => B1
)
它是正常排序的,但是,我愿意让它根据数字、NumbersLetters、LettersNumbers、Letters 等组合进行排序。
例如,此数组应如下所示:
Array
(
[42] => 3
[43] => 4
[0] => 5
[44] => 6
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 11
[6] => 12
[7] => 13
[8] => 14
[9] => 15
[10] => 16
[11] => 17
[12] => 18
[13] => 19
[14] => 20
[15] => 21
[48] => 22
[16] => 23
[17] => 24
[49] => 25
[18] => 26
[50] => 27
[19] => 28
[20] => 29
[21] => 30
[22] => 31
[23] => 32
[24] => 33
[25] => 34
[26] => 35
[27] => 36
[28] => 37
[29] => 38
[30] => 39
[31] => 40
[32] => 41
[33] => 42
[34] => 44
[35] => 46
[36] => 48
[37] => 50
[38] => 52
[39] => 54
[47] => 1A
[51] => 1B
[45] => A1
[46] => B1
[40] => A
[41] => B
)
解决方案
您可以使用用户定义uasort
的排序,查看演示
uasort($array,function($a,$b){
if(is_numeric($a) && is_numeric($b)){
return $a - $b;
}elseif(is_numeric($a)){
return -1;
}elseif(is_numeric($b)){
return 1;
}else{
$length = max(strlen($a),strlen($b));
return strcmp(str_pad($a,$length,"z",STR_PAD_LEFT),str_pad($b,$length,"z",STR_PAD_LEFT));
}
});
推荐阅读
- sql - 子查询中的动态表名和变量
- python-3.x - Python Asyncio - 服务器能够在不同时间接收多命令并处理它
- html - 如何使水平线从 div 元素的右侧开始?
- ruby-on-rails - 如何使用 Liquid Shopify 显示每张幻灯片包含 3 个项目的引导轮播
- python - Micro-Manager-1.4: ImportError: DLL load failed: Le module spécifié est introuvable
- python - 自制 Tkinter 弹出菜单 Python
- sql - SQL Server 不连接到本地计算机以外的任何服务器
- sql-server - Linux SQL Server:无法使用 SSMS 显示日志
- ios - 点击标记时如何删除谷歌地图上的形状(圆圈)?
- git - 如何为单个 git push 指定策略