我有这样的数据:
音频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
如果他们只是数字(即没有音频,文件,测试),那么我可以只是数字排序。
然而,我怎样才能在这里首先按文字排序,然后再按数字排序。
发布于 2010-06-06 13:49:15
我想你要找的是纳蒂。
bool natsort ( array &$array )这个函数实现了一种排序算法,它以人类在维护键/值关联时的方式对字母数字字符串进行排序。这被描述为“自然秩序”..。
发布于 2010-06-06 13:45:35
最好的解决方案是有一个稳定的排序算法,它首先按文本排序,然后按数字排序,但是对于这种情况,您可以使用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";
}
https://stackoverflow.com/questions/2984353
复制相似问题