我必须制作排名功能。
在我的$ passages数组中,我有'user','username','note'和'classement'键。
我想设置'classement'键,按'note'键排序,按'username'键排序数组。
这是我试过的:
for ($i = 0; $i < sizeof($passages); $i++) {
for ($j = 0; $j < sizeof($passages); $j++) {
$test = $this->compare($passages[$i]['note'], $passages[$j]['note']);
if ($test < 0) {
$tmp = $passages[$j];
$passages[$j] = $passages[$i];
$passages[$i] = $tmp;
} else if ($test >= 0) {
$tmp = $passages[$i];
$passages[$i] = $passages[$j];
$passages[$j] = $tmp;
}
}
}
比较功能:
if ($a==$b) return 0;
return ($a<$b)?-1:1;
在这个排名函数中,我添加了一个处理关系的函数:
$rank = 1;
for ($i = 0; $i < $nbTotal; $i++) {
// Si la note du passage actuel est égale à la note du passage précédent,
// le classement est égal au classement du passage précédent
if ($i > 0 && $passages[$i]['note'] == $passages[$i - 1]['note']) {
$passages[$i]['classement'] = $passages[$i - 1]['classement'];
}
// Sinon le classement est égal à la valeur de $rank
else {
$passages[$i]['classement'] = $rank;
}
$rank++;
}
我测试了我的函数,它返回了一个按用户ID和'classement'键=用户ID顺序排序的数组。
我得到了什么:
$passages = array(
array(['id'] => "1"
['username'] => "1124",
['note'] => "22",
['classement'] => "1"),
array(['id'] => "2",
['username'] => "1001",
['note'] => "10",
['classement'] => "2"),
array(['id'] => "3",
['username'] => "1100",
['note'] => "15",
['classement'] => "3"),
array(['id'] => "4",
['username'] => "1120",
['note'] => "5",
['classement'] => "4"),
array(['id'] => "5",
['username'] => "1200",
['note'] => "15",
['classement'] => "5")
);
我想要的是什么:
$passages = array(
array(['id'] => "2"
['username'] => "1001",
['note'] => "10",
['classement'] => "4"),
array(['id'] => "3",
['username'] => "1100",
['note'] => "15",
['classement'] => "2"),
array(['id'] => "4",
['username'] => "1120",
['note'] => "5",
['classement'] => "5")
array(['id'] => "1",
['username'] => "1124",
['note'] => "22",
['classement'] => "1"),
array(['id'] => "5",
['username'] => "1200",
['note'] => "15",
['classement'] => "2")
);
答案 0 :(得分:1)
第1步:按$passages
键降序排列note
数组
array_multisort(array_column($passages, 'note'), SORT_DESC, SORT_NUMERIC, $passages);
第2步:设置等级
$rank = 1;
$nbTotal = count($passages);
for ($i = 0; $i < $nbTotal; $i++) {
// Si la note du passage actuel est égale à la note du passage précédent,
// le classement est égal au classement du passage précédent
if ($i > 0 && $passages[$i]['note'] == $passages[$i - 1]['note']) {
$passages[$i]['classement'] = $passages[$i - 1]['classement'];
}
// Sinon le classement est égal à la valeur de $rank
else {
$passages[$i]['classement'] = $rank;
}
$rank++;
}
第3步:按$passages
键递增username
数组
array_multisort(array_column($passages, 'username'), SORT_ASC, SORT_NUMERIC, $passages);