PHP如何按每个字符串中间的数字子串对一维数组进行排序
解决方案
核心思路是用PHP内置的usort自定义排序逻辑,配合正则提取_Track后的序号作为排序依据,完全解决你当前遇到的问题。
补充:你贴的示例代码里
"Deeper Ocean_Track4.mp3"末尾漏了逗号,实际运行会报语法错误,调试时注意补上。
<?php $tracks = array( "Arcane Library_Track2.mp3", "Deeper Ocean_Track4.mp3", "Neon Illumination_Track3.mp3", "Sound Of Cars_Track1.mp3", "Test File_Track5.ogg", "Another Demo_Track6.wav" ); usort($tracks, function($a, $b) { // 匹配提取_Track后面的数字 preg_match('/_Track(\d+)/', $a, $matchesA); preg_match('/_Track(\d+)/', $b, $matchesB); // 兼容没有匹配到的情况,默认给超大值排到末尾 $numA = isset($matchesA[1]) ? intval($matchesA[1]) : 99999; $numB = isset($matchesB[1]) ? intval($matchesB[1]) : 99999; // 用太空船运算符比较,PHP7+支持 return $numA <=> $numB; }); // 输出验证 print_r($tracks); ?>
方案优势
- 仅需一次排序调用,无需额外循环反转字符串,执行效率更高
- 排序逻辑完全基于
_Track后的数字,不受文件后缀格式、前面文件名内容的影响 - 代码可读性更强,后续维护时可以直接调整正则匹配规则适配其他排序规则
如果你的运行环境是PHP7以下版本,把太空船运算符的部分换成普通数值比较即可:
return $numA - $numB;
内容的提问来源于stack exchange,提问作者Miger
相关产品推荐
相关产品推荐

