多维数组中有关系的排序函数

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);