我有以下数据:
音频1测试
档案10
音频2
音频3
档案11 音频1
音频13
音频22
文件20测试
测试文件22
音频10
档案1
文件2
我首先要通过文本(即音频,文件,测试)然后按编号(1,2,3,4,5,6,7,8,9,10,11,12,13, 14,15,16,17,18,19,20,21,22等。)
问题是排序它会返回如下内容:
音频1
音频1测试
音频10
音频13
音频2
音频22
音频3
档案1
档案10
档案11
档案2
文件20测试
测试文件22
虽然我想要的结果是:
音频1
音频1测试
音频2
音频3
音频10
音频13
音频22
档案1
档案2
档案10
档案11
文件20测试
测试文件22
如果它们只是数字(即没有音频,文件,测试),那么我可以按数字排序。
但是,我如何先按文字排序,然后按数字排序。
答案 0 :(得分:4)
最好的解决方案是使用稳定排序算法,首先按文本排序,然后按数字排序,但是你可以使用usort
和你自己的比较算法来实现同样的情况。
这是我在2分钟内为你做的解决方案(为丑陋的代码道歉)。
<?php
$str = 'Audio 1
File 10
Audio 2
Audio 3
File 11
Audio 13
Audio 22
File 20
Test 22
Audio 10
File 1
File 2';
$arr = explode("\n", $str);
foreach($arr as $k => $v) {
$arr[$k] = explode(" ", $v);
}
function mycmp($value1, $value2) {
$txt1 = $value1[0];
$txt2 = $value2[0];
$num1 = intval($value1[1]);
$num2 = intval($value2[1]);
if($txt1 === $txt2) {
return $num1 > $num2;
}
else {
return strcmp($txt1, $txt2) > 0;
}
};
usort($arr, "mycmp");
foreach($arr as $v) {
echo $v[0]. "\t" . $v[1]. "\n";
}
答案 1 :(得分:2)
我认为你要找的是natsort。
bool natsort(array&amp; $ array)
此函数实现了一种排序算法,该算法按照人类维护键/值关联的方式对字母数字字符串进行排序。这被描述为“自然排序”......