
本文介绍如何将包含“g”和“kg”两种单位的字符串型重量数组,统一转换为克(g)为基准的数值后精准升序排序,并保持原始字符串格式输出。
本文介绍如何将包含“g”和“kg”两种单位的字符串型重量数组,统一转换为克(g)为基准的数值后精准升序排序,并保持原始字符串格式输出。
在实际开发中,常需处理用户输入或外部数据中混用单位的度量值(如 '1 Kg'、'300 g')。若直接按字符串排序(如 sort()),会因字典序导致 '1 Kg' 提取数值并归一化为同一单位(推荐统一转为克),再以该数值为键排序。
以下是一个健壮、可扩展的 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,避免误判(如 '100g' 无空格、'Kg' 大小写不敏感);
- trim() 防止首尾空格干扰解析;
- 统一转为 float 确保小数(如 1.5)精度无损;
- ksort() 保证数值升序,array_values() 重置索引,返回标准索引数组。
⚠️ 注意事项:
- 本方案假设输入格式规范(仅含一个数值+一个单位),如需支持 mg、lb 等更多单位,只需扩展正则分组与单位换算逻辑;
- 若存在非法格式(如 '2.5 XYZ'),建议添加 else 分支记录警告或抛出异常,提升鲁棒性;
- 不推荐使用 usort() 配合匿名函数做原地排序——因需重复解析单位,性能略低且不易复用。
通过单位归一化+键值映射排序,即可简洁、准确、可维护地解决多单位混合度量的排序问题。

















