如何对含不同单位(克与千克)的重量数组进行正确排序
作者:OpenWorld
时间:2026-07-07
浏览:0
对含克与千克的重量数组排序,需先通过正则提取数值和单位,统一换算为克,再按键升序排序,最后恢复原始字符串格式。该方法可避免字典序错误,并支持扩展其他单位。
如果你开发过电商后台、物流系统或者任何需要处理实物重量的应用,大概率会遇到这样一个场景:用户上传的数据里,有的写了“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()配合匿名函数做原地排序。理由很简单:每次比较都要重新解析单位,性能差,而且逻辑分散,不利于后期维护。
说到底,这类问题的核心就是“单位归一化 + 键值映射排序”。把不同单位的度量值先换算成同一把尺子,再排序,再还原——思路清晰、代码简洁、可维护性也高。下次遇到混用单位的排序需求,不妨试试这个套路。
作者最新文章
三星 Galaxy A08 渲染图曝光:Helio G99 芯片与 6000mAh 电池配置解析
2026-09-08 17:14
OPPO Find X10 Pro Max 影像规格详解:三颗2亿像素镜头与全焦段8K视频能力
2026-09-08 16:41
PDF转HTML在线转换器怎么选?转换后网页排版怎么查?
2026-09-04 11:02
AE教程书籍挑选指南:零基础、动效与合成方向实战标准
2026-09-02 13:31
教程书籍使用SAI软件Logo要单独授权吗:商标引用与出版合规要点
2026-09-02 11:50
上一篇:
Ubuntu Python代码优化方法
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































