【问题标题】:Order by text and then by number按文本排序,然后按数字排序
【发布时间】:2010-06-06 13:36:45
【问题描述】:

我有如下数据:

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

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

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

【问题讨论】:

    标签: php sorting numbers


    【解决方案1】:

    最好的解决方案是有一个稳定的排序算法,它首先按文本排序,然后按数字排序,但是对于这种情况,您可以使用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";
    }
    

    【讨论】:

    • 谢谢,这看起来不错。如果输入类似于 Test File 1 Test File 2 或者类似:File 1 test File 2 Test
    【解决方案2】:

    我想你要找的是natsort

    bool natsort ( 数组 &$array )

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

    【讨论】:

    • 这正是我所需要的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2020-11-26
    • 2021-11-28
    相关资源
    最近更新 更多