如何对含不同单位(克与千克)的重量数组进行正确排序
对含克与千克的重量数组排序,需先通过正则提取数值和单位,统一换算为克,再按键升序排序,最后恢复原始字符串格式。该方法可避免字典序错误,并支持扩展其他单位。
如果你开发过电商后台、物流系统或者任何需要处理实物重量的应用,大概率会遇到这样一个场景:用户上传的数据里,有的写了“1 Kg”,有的写了“300 g”,甚至还有“1.5Kg”这种不带空格的。你以为拿sort()一把梭就能搞定?结果排序出来,“1 Kg”排到了“20 g”前面——按字典序,“1”确实小于“2”,但20克才0.02千克,本该排第一才对。这就是典型的单位混用陷阱。
解决思路其实很朴素:先把所有重量统一到一个基准单位(推荐克),然后按数值排序,最后再恢复成原始字符串格式输出。下面给出一段健壮且可扩展的 PHP 实现,直接看代码:
$weights = ['1 Kg', '300 g', '1.5 Kg', '20 g', '5 Kg'];// 构建归一化映射:数值(单位:克) → 原始字符串$normalized = [];foreach ($weights as $str) { $str = trim($str); // 使用正则安全提取数值和单位(支持空格、大小写) if (preg_match('/^([\d.]+)\s*([gG]|[kK][gG])$/', $str, $matches)) { $value = (float)$matches[1]; $unit = strtoupper($matches[2]); $grams = $unit === 'G' ? $value : $value * 1000; // 'G' → 克;'KG' → 千克转克 $normalized[$grams] = $str; }}// 按克为单位的数值升序排序(保留原始字符串)ksort($normalized);$sorted_weights = array_values($normalized);print_r($sorted_weights);// 输出:Array ( [0] => 20 g [1] => 300 g [2] => 1 Kg [3] => 1.5 Kg [4] => 5 Kg )
几个值得留意的设计细节:
- 用
preg_match而不是strpos或explode,是为了避免误判——比如“100g”没有空格,“Kg”大小写混写,正则都能一把兜住; trim()看似小动作,实则可以防止用户不经意敲出的首尾空格干扰解析;- 数值统一转为
float,确保像“1.5”这样的小数不会丢失精度; - 用
ksort()按键升序,再用array_values()重置索引,得到的就是干净的标准索引数组。
需要你额外留意的几个点:
- 这段代码默认输入格式比较规范——一个数值加一个单位。如果你需要支持 mg(毫克)、lb(磅)等单位,只要扩展正则里的单位分组和换算逻辑即可,框架不变;
- 如果遇到“2.5 XYZ”这种彻底不合规的数据,建议加个
else分支记录警告或者抛出异常,否则静默跳过容易埋坑; - 不推荐用
usort()配合匿名函数做原地排序。理由很简单:每次比较都要重新解析单位,性能差,而且逻辑分散,不利于后期维护。
说到底,这类问题的核心就是“单位归一化 + 键值映射排序”。把不同单位的度量值先换算成同一把尺子,再排序,再还原——思路清晰、代码简洁、可维护性也高。下次遇到混用单位的排序需求,不妨试试这个套路。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













