You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在保持原数组位置不变的情况下映射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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:31:17