按文字排序,然后按编号排序

时间:2010-06-06 13:36:45

标签: php sorting numbers

我有以下数据:

  

音频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

如果它们只是数字(即没有音频,文件,测试),那么我可以按数字排序。

但是,我如何先按文字排序,然后按数字排序。

2 个答案:

答案 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)

  此函数实现了一种排序算法,该算法按照人类维护键/值关联的方式对字母数字字符串进行排序。这被描述为“自然排序”......