【问题标题】:Ranking function with tie in multidimensional array多维数组中带领带的排名函数
【发布时间】:2016-08-04 08:29:42
【问题描述】:

我必须做一个排名功能。

在我的 $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 排序且“分类”键 = 用户 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")
           );

【问题讨论】:

    标签: php arrays sorting symfony ranking


    【解决方案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 步:按username 键升序对$passages 数组进行排序

    array_multisort(array_column($passages, 'username'), SORT_ASC, SORT_NUMERIC, $passages);
    

    【讨论】:

    • 非常感谢!这正是我想要的!有了这个解决方案,我的代码现在更小了。
    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多