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

如何编写Laravel自定义排序回调实现指定衬衫尺码排序?

自定义衬衫尺码排序的实现方案

要实现你需要的尺码排序逻辑,核心是先给每个尺码前缀定义优先级权重,再拆分尺码的前缀与数字部分,按「前缀权重→数字大小」的顺序排序。以下是Laravel环境下的最佳实现方式:

步骤1:定义尺码前缀权重映射

先把你需要的尺码优先级转换成数字权重,权重越小排序越靠前:

$sizePriority = [
    'XS' => 1,
    'S' => 2,
    'M' => 3,
    'L' => 4,
    'XL' => 5,
    '2XL' => 6,
    '3XL' => 7,
    // 按需添加更多尺码前缀
];

步骤2:编写自定义排序回调

使用sortBy的闭包回调,拆分每个尺码的前缀和数字,然后返回排序依据的数组:

$sortedItems = $items->sortBy(function ($item) use ($sizePriority) {
    // 拆分尺码的前缀(含数字的前缀如2XL)和后面的数字部分
    preg_match('/([a-zA-Z0-9]+)(\d+)/', $item->size, $matches);
    $prefix = $matches[1] ?? $item->size;
    $number = (int)($matches[2] ?? 0);
    
    // 返回排序依据:先前缀权重,再数字大小
    return [
        $sizePriority[$prefix] ?? PHP_INT_MAX, // 未知前缀放最后
        $number
    ];
});

关键说明

  • 正则表达式/([a-zA-Z0-9]+)(\d+)/可以正确拆分带数字的前缀(比如2XL、3XL)和后面的数字(比如1、3);
  • 用$sizePriority[$prefix] ?? PHP_INT_MAX确保未知的尺码前缀会被排到最后;
  • 返回的数组会让Laravel先按第一个元素(前缀权重)排序,权重相同的再按第二个元素(数字大小)排序,完全匹配你要的XS1, XS3... S1, S3...顺序。

简化版(如果尺码格式固定)

如果你的尺码格式是「纯字母前缀+数字」(比如没有2XL这类带数字的前缀),可以简化拆分逻辑:

$sortedItems = $items->sortBy(function ($item) use ($sizePriority) {
    $prefix = preg_replace('/\d+/', '', $item->size);
    $number = (int)preg_replace('/[a-zA-Z]+/', '', $item->size);
    return [$sizePriority[$prefix] ?? PHP_INT_MAX, $number];
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:30:05