如何编写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
相关产品推荐
相关产品推荐

