如何在保持原数组位置不变的情况下映射PHP数组元素的排名?
嘿,这个问题我之前也踩过坑!直接排序确实会把原数组的顺序搞乱,咱们得换个思路——先给每个数值确定好对应的排名,再去原数组里逐个替换,这样就能保住原来的位置啦。
具体实现方法
核心就是先建立数值到排名的映射表,然后遍历原数组查表替换就行,步骤很清晰:
1. 复制并排序原数组
先把原数组复制一份,对复制后的数组做降序排序,这样最大的数排在第一位,方便我们给它分配排名1,第二大的分配2,以此类推。
2. 生成排名映射表
遍历排序后的数组,把每个数值和它的排名(索引+1,因为数组索引从0开始)对应起来,存到一个关联数组里。
3. 替换原数组元素
最后遍历原数组,用映射表里的排名替换每个元素,得到的就是你想要的结果数组啦。
完整代码示例
<?php $row_arr_1 = array(7,9,5,10); // 复制原数组并降序排序 $sorted_arr = $row_arr_1; rsort($sorted_arr); // 创建数值到排名的映射 $rank_mapping = []; foreach ($sorted_arr as $index => $num) { $rank_mapping[$num] = $index + 1; } // 遍历原数组生成结果 $row_arr_2 = []; foreach ($row_arr_1 as $num) { $row_arr_2[] = $rank_mapping[$num]; } // 验证结果 print_r($row_arr_2); // 输出:Array ( [0] => 3 [1] => 2 [2] => 4 [3] => 1 ) ?>
补充:处理重复值的情况
如果你的原数组里有重复数值,比如array(10,9,9,7),上面的代码会让两个9都对应排名2,这通常是符合排名逻辑的(并列第二)。如果需要给重复值按出现顺序分配不同排名,那可以稍微调整排序后的处理逻辑,比如用array_unique先去重再生成映射,或者遍历原数组的时候记录已处理的数值,但你的例子里没有重复,这个就作为扩展参考啦。
内容的提问来源于stack exchange,提问作者Md. Shamvil Hossain
相关产品推荐
相关产品推荐

