可变长度多数组数值的得分与排名计算方案咨询
计算逻辑实现方案
核心处理逻辑
要解决数组项数不统一的问题,同时匹配「数值越高得分越高、得分区间0-10」的规则,按两步处理:
- 先统一映射所有数值到0-10的得分区间:拉取所有数组的全部数值,取最大值、最小值做归一化转换,数值越高转换后的得分越高
- 再按数组维度聚合得分,消除长度差异影响,两种可选聚合方式:
- 中位数聚合:取数组内所有数值转换后得分的中位数,不受极端值、数组长度影响,适合数据波动大的场景
- 平均值聚合:取数组内所有数值转换后得分的平均值,能兼顾所有数据的贡献,适合数据分布均匀的场景
完整PHP实现代码
<?php // 示例输入数据 $data1 = "4.12,9.95,2.44,3.80,10.68,-1.15,11.81"; $data2 = "12.61"; $data3 = "4.55,9.70,6.44,-1.04,12.55"; // 1. 预处理所有数据,收集全量数值找极值用于归一化 $allValues = []; $dataset = [ 'arr1' => array_map('floatval', explode(',', $data1)), 'arr2' => array_map('floatval', explode(',', $data2)), 'arr3' => array_map('floatval', explode(',', $data3)) ]; foreach ($dataset as $arr) { $allValues = array_merge($allValues, $arr); } $minVal = min($allValues); $maxVal = max($allValues); // 2. 归一化数值到0-10得分的函数 function getScore($val, $minVal, $maxVal) { // 避免最大值最小值相等导致除以0 if ($maxVal == $minVal) return 10; // 线性转换,数值越高得分越高,区间0-10 return round(($val - $minVal) / ($maxVal - $minVal) * 10, 2); } // 3. 计算每个数组的聚合得分(此处用中位数方案,可替换为平均值) function calculateArrScore($arr, $minVal, $maxVal) { // 先算每个元素的得分 $scores = array_map(function($val) use ($minVal, $maxVal) { return getScore($val, $minVal, $maxVal); }, $arr); // 取中位数逻辑 sort($scores); $count = count($scores); $mid = floor(($count - 1) / 2); if ($count % 2) { return $scores[$mid]; } else { return round(($scores[$mid] + $scores[$mid + 1]) / 2, 2); } // 如果要用平均值方案,注释上面中位数逻辑,打开下一行即可 // return round(array_sum($scores)/count($scores),2); } // 4. 计算所有数组得分并排名 $rankResult = []; foreach ($dataset as $key => $arr) { $rankResult[$key] = calculateArrScore($arr, $minVal, $maxVal); } // 按得分降序排序,保留键名 arsort($rankResult); // 输出结果 print_r($rankResult); ?>
示例输出说明
用给出的测试数据运行中位数方案的输出结果如下,符合预期:
Array ( [arr2] => 10 [arr3] => 5.23 [arr1] => 3.35 )
只有单个高值的arr2得分最高排名第一,arr3次之,arr1最低。
内容的提问来源于stack exchange,提问作者user11249486
相关产品推荐
相关产品推荐

