You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对以'-'分隔字符串值的PHP数组进行升序排序?

自定义数组排序解决方案

没问题,我来帮你搞定这个排序需求——让'2-0'(原数组的第19个元素)排在首位,'9-0'(原数组的第18个元素)排在末尾,其余元素按值升序排列。下面是具体的实现方案,用PHP的usort()函数就能轻松完成:

代码实现

场景1:按字符串自然升序排序

如果你的“按值升序”指的是字符串层面的自然排序(比如'4-10'会排在'4-2'前面,因为字符串比较中'1'的ASCII码小于'2'),可以用这段代码:

$arr = [
    '4-0', '4-1', '4-2', '4-3', '4-4', '4-5', '4-6', '4-7', '4-8', '4-9',
    '4-10', '4-11', '4-12', '4-13', '4-14', '4-15', '4-16', '8-0', '9-0', '2-0', '5-0', '7-1'
];

usort($arr, function($a, $b) {
    // 强制'2-0'排在最前面
    if ($a === '2-0') return -1;
    if ($b === '2-0') return 1;
    
    // 强制'9-0'排在最后面
    if ($a === '9-0') return 1;
    if ($b === '9-0') return -1;
    
    // 其余元素按字符串升序排列
    return strcmp($a, $b);
});

// 查看排序后的结果
print_r($arr);

场景2:按拆分后的数值升序排序(更符合直观逻辑)

如果你的“按值升序”是指把每个元素拆成前后两个数字,先比较前面的数字,前面相同再比后面的(比如'4-2'会排在'4-10'前面,因为2 < 10),那可以用这个版本的代码:

$arr = [
    '4-0', '4-1', '4-2', '4-3', '4-4', '4-5', '4-6', '4-7', '4-8', '4-9',
    '4-10', '4-11', '4-12', '4-13', '4-14', '4-15', '4-16', '8-0', '9-0', '2-0', '5-0', '7-1'
];

usort($arr, function($a, $b) {
    // 优先处理'2-0'的位置
    if ($a === '2-0') return -1;
    if ($b === '2-0') return 1;
    
    // 处理'9-0'的末尾位置
    if ($a === '9-0') return 1;
    if ($b === '9-0') return -1;
    
    // 拆分元素为两个数字部分
    list($aNum1, $aNum2) = explode('-', $a);
    list($bNum1, $bNum2) = explode('-', $b);
    
    // 先比较第一部分数字
    $firstCompare = (int)$aNum1 - (int)$bNum1;
    if ($firstCompare !== 0) {
        return $firstCompare;
    }
    // 第一部分相同则比较第二部分数字
    return (int)$aNum2 - (int)$bNum2;
});

// 输出排序结果
print_r($arr);

逻辑说明

  • usort()是PHP里用来自定义排序的核心函数,它会根据你写的回调函数来决定元素的顺序:返回负数时$a排在$b前面,正数时$b排在$a前面,0则顺序不变。
  • 我们先对'2-0'和'9-0'做特殊判断,确保它们的位置完全符合你的要求;剩下的元素再按照你需要的升序规则排列。
  • 两种场景可以根据你实际的“值升序”需求来选择,第二种数值拆分的排序通常更符合日常对这类字符串的排序直觉。

内容的提问来源于stack exchange,提问作者Antonios Tsimourtos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:17:27