多维数组中有关系的排序函数
Ranking function with tie in multidimensional array
我要做一个排名功能。
在我的 $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")
);
第 1 步:按 note
键降序排列 $passages
数组
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 步:按 username
键对 $passages
数组进行升序排序
array_multisort(array_column($passages, 'username'), SORT_ASC, SORT_NUMERIC, $passages);
我要做一个排名功能。
在我的 $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")
);
第 1 步:按 note
键降序排列 $passages
数组
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 步:按 username
键对 $passages
数组进行升序排序
array_multisort(array_column($passages, 'username'), SORT_ASC, SORT_NUMERIC, $passages);