PHP实现多维数组中km字段转浮点数并按其升序排序的方法
PHP多维数组按km数值升序排序的解决方案
我来给你拆解一下这个需求的解决步骤,其实分两步走就很清晰:先把每个元素里km对应的字符串转换成浮点数,再基于这个数值进行升序排序。下面给你两种实用的方案,你可以根据自己的需求选择:
方案一:先预处理数组(修改原km值为数值)
这种方案会直接把数组里的km字符串替换成对应的浮点数,后续排序和使用都更方便:
$array = array( array('km' => '25 Km', 'name' => 'B'), array('km' => '1.2 Km', 'name' => 'A'), array('km' => '7.7 Km', 'name' => 'Q'), array('km' => '107 Km', 'name' => 'M'), array('km' => '0.1 Km', 'name' => 'R'), array('km' => '20 Km', 'name' => 'J'), array('km' => '20.3 Km', 'name' => 'HH') ); // 遍历数组,将每个km字符串转为浮点数 foreach ($array as &$item) { // 用正则去掉非数字和小数点的字符,再转成浮点数 $item['km'] = floatval(preg_replace('/[^\d.]/', '', $item['km'])); } unset($item); // 解除引用,避免后续操作意外修改数组元素 // 按km数值升序排序 usort($array, function($a, $b) { // 太空船运算符(PHP 7+支持),简洁实现数值比较 return $a['km'] <=> $b['km']; }); // 输出排序后的数组 print_r($array);
方案二:排序时动态处理(保留原km字符串)
如果你不想修改原数组里的km字符串,只想在排序的时候用数值比较,可以直接在排序的回调函数里处理:
$array = array( array('km' => '25 Km', 'name' => 'B'), array('km' => '1.2 Km', 'name' => 'A'), array('km' => '7.7 Km', 'name' => 'Q'), array('km' => '107 Km', 'name' => 'M'), array('km' => '0.1 Km', 'name' => 'R'), array('km' => '20 Km', 'name' => 'J'), array('km' => '20.3 Km', 'name' => 'HH') ); // 排序时动态提取km的数值进行比较 usort($array, function($a, $b) { $kmA = floatval(preg_replace('/[^\d.]/', '', $a['km'])); $kmB = floatval(preg_replace('/[^\d.]/', '', $b['km'])); return $kmA <=> $kmB; }); // 输出排序后的数组(km还是原来的字符串格式) print_r($array);
补充说明
- 正则表达式
/[^\d.]/的作用是匹配所有非数字和小数点的字符,这样不管km后面跟的是"Km"、"km"还是其他单位,都能准确提取数字部分。 - 太空船运算符
<=>是PHP 7及以上版本才支持的,如果你的PHP版本较低,可以替换成return $kmA - $kmB;,同样能实现升序排序。
内容的提问来源于stack exchange,提问作者Ntiyiso Rikhotso
相关产品推荐
相关产品推荐

