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

PHP如何将混合数字与尺码字符串的数组按指定规则排序

PHP自定义数组排序问题

我有如下PHP数组:

$po = array ( 
5 => '8', 
6 => '10', 
7 => '12', 
8 => '41', 
12 => '42', 
9 => '43', 
10 => '44', 
11 => '45', 
1 => 'L', 
0 => 'M', 
4 => 'S', 
2 => 'XL', 
3 => 'XXL', 
13 => 'XXS'
);

排序规则

  • 所有数值型值优先排列,按升序排序
  • 字母类尺码值按指定顺序排列:$order = ['XXS','XS','S','M','L','XL','XXL'];

现有代码问题

原有代码仅处理了尺码的排序逻辑,没有区分数值和尺码的优先级,也没有做数值升序的判断;同时array_search找不到对应尺码时会返回false,直接做减法会被转为0,导致数值排序完全混乱。

修复后的实现代码

如果不需要保留原数组的键名,使用usort即可;如果需要保留原始键名,将usort替换为uasort:

$sizeOrder = ['XXS','XS','S','M','L','XL','XXL'];
usort($po, function ($a, $b) use ($sizeOrder) {
    // 先判断元素类型
    $aIsNumeric = is_numeric($a);
    $bIsNumeric = is_numeric($b);
    
    // 两者都是数值,按升序排序
    if ($aIsNumeric && $bIsNumeric) {
        return intval($a) - intval($b);
    }
    // 仅a是数值,a优先级更高排前面
    if ($aIsNumeric && !$bIsNumeric) {
        return -1;
    }
    // 仅b是数值,b优先级更高排前面
    if (!$aIsNumeric && $bIsNumeric) {
        return 1;
    }
    // 两者都是尺码,按指定顺序排序
    $posA = array_search($a, $sizeOrder);
    $posB = array_search($b, $sizeOrder);
    return $posA - $posB;
});

最终排序结果

array (
  0 => '8',
  1 => '10',
  2 => '12',
  3 => '41',
  4 => '42',
  5 => '43',
  6 => '44',
  7 => '45',
  8 => 'XXS',
  9 => 'S',
  10 => 'M',
  11 => 'L',
  12 => 'XL',
  13 => 'XXL',
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 06:24:03