首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按文本顺序,然后按编号排序

按文本顺序,然后按编号排序
EN

Stack Overflow用户
提问于 2010-06-06 13:36:45
回答 2查看 534关注 0票数 1

我有这样的数据:

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

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

然而,我怎样才能在这里首先按文字排序,然后再按数字排序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-06 13:49:15

我想你要找的是纳蒂

bool natsort ( array &$array )这个函数实现了一种排序算法,它以人类在维护键/值关联时的方式对字母数字字符串进行排序。这被描述为“自然秩序”..。

票数 2
EN

Stack Overflow用户

发布于 2010-06-06 13:45:35

最好的解决方案是有一个稳定的排序算法,它首先按文本排序,然后按数字排序,但是对于这种情况,您可以使用usort和您自己的比较算法实现相同的排序。

下面是我在2分钟内为您做的一个解决方案(对于丑陋的代码表示歉意)。

代码语言:javascript
运行
复制
<?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";
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2984353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档