我在php中有两个数组,$array1
和$array2
,我根据$array2
排名$array1
$array1 =array(2,10,4,5,2,1);
$array2 =array(A,B,C,D,E,F);
$ordered_values = $array1;
array_multisort($array1, $array2);
foreach ($array1 as $key => $value) {
foreach ($ordered_values as $ordered_key => $ordered_value) {
if ($value === $ordered_value) {
$key = $ordered_key;
break;
}
}
echo $value . '- Rank: ' . ((int) $key + 1) . '<br/>';
}
上面给出了这个结果
1- Rank: 6
2- Rank: 1
2- Rank: 1
4- Rank: 3
5- Rank: 4
10-Rank: 2
然而,这正是我所期待的
B- Rank: 1
D- Rank: 2
C- Rank: 3
E- Rank: 4
A- Rank: 4
F- Rank: 6
感谢任何帮助。
答案 0 :(得分:2)
您可以array_combine
两个数组排列它们并arsort
按值排序并保留关键字。在循环之前设置一个等级号的计数器。还要为之前的值添加一个临时持有者,以检查我们是否要使排名编号保持不变,另一个容器是否完成了多少次跳过:
$array3 = array_combine($array2, $array1); arsort($array3);
$skip = 0; $i = 0; $temp = null;
foreach($array3 as $k => $v) {
if($temp !== $v) {$i++; $i += $skip; $skip = 0;}else {$skip++;}
$temp = $v;
echo $k, ' Rank: ', $i, "\n";
}
上面的if
条件只检查前一个值是否不相等。如果没有,只需继续增量。如果它在跳过计数器上相等。然后,一旦迭代在非相等上恢复,这将把跳过计数器合并到当前的秩数。