PHP用rsort()排序整数浮点数混合数组结果异常如何解决
问题根因
你使用的rsort()本身支持整数、浮点数混合排序,排序逻辑没有问题,异常来自PHP关联数组的键类型转换规则:
- PHP关联数组的键仅支持整数、字符串两种类型,浮点数作为键时会被自动强制转换为整数,小数部分直接截断。你示例中的
1.7、1.9、1.4作为键时都会被转为1,后面的赋值会覆盖前面的同名键,最终$high_name实际仅保留一个元素1 => "d",所以你无论取排序后哪个位置的数值作为索引,拿到的结果都是d。
修复方案
建议直接将数值与对应的标识绑定后排序,从根源上避免浮点数作为键的转换问题,代码如下:
// 把数值和对应标识绑定为二维数组 $list = [ ['value' => 1.7, 'tag' => 'a'], ['value' => 1, 'tag' => 'b'], ['value' => 1.9, 'tag' => 'c'], ['value' => 1.4, 'tag' => 'd'], ]; // 按数值从高到低排序 usort($list, function($prev, $next) { return $next['value'] <=> $prev['value']; }); // 按排序后顺序取标识 $on1 = $list[0]['tag']; $on2 = $list[1]['tag']; $on3 = $list[2]['tag']; $on4 = $list[3]['tag'];
运行后输出结果和你预期完全一致:
on1 = c on2 = a on3 = d on4 = b
内容的提问来源于stack exchange,提问作者Levchik
相关产品推荐
相关产品推荐

