在多维数组中使用tie进行排名功能

时间:2016-08-04 08:29:43

标签: php arrays sorting symfony ranking

我必须制作排名功能。

在我的$ 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 个答案:

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