Студенческий рейтинг связывает баллы PHP-кода

Пожалуйста, помогите мне в ранжировании с помощью формулы, например:

std_no    score        rank  

 1        50           1
 4        45           2
 3        45           3
 2        45           4
 5        45           5
 6        30           6

приведенный выше пример правильный, но я хочу, чтобы это было так.

std_no   score        rank  

 1       50            1
 4       45            3.5
 3       45            3.5
 2       45            3.5
 5       45            3.5
 6       30            6

как получить 3.5? ранг формулы. 2,3,4,5 добавить, а затем разделить на 4, что является количеством того же ранга 45.


person Mike Pagdanganan    schedule 19.08.2013    source источник
comment
Хоть код покажи   -  person Ole Albers    schedule 19.08.2013
comment
Обычно 4 ученика с одинаковым баллом должны быть вторыми, а не 3,5.   -  person goto    schedule 19.08.2013
comment
std_no не должен быть уникальным? потому что это 2 std_no 1   -  person Xavier S.    schedule 19.08.2013
comment
но формула добавляет ранг всех одинаковых баллов и делит его на количество одинаковых баллов   -  person Mike Pagdanganan    schedule 19.08.2013
comment
@binogure извините неправильный тип   -  person Mike Pagdanganan    schedule 19.08.2013
comment
Ваша форумла: (минимальный ранг + максимальный ранг) / 2 (для одного и того же балла)   -  person Xavier S.    schedule 19.08.2013
comment
как получить минимальный ранг и максимальный ранг php-кода   -  person Mike Pagdanganan    schedule 19.08.2013
comment
я использую массив = (50,45,45,45,45,30)   -  person Mike Pagdanganan    schedule 19.08.2013


Ответы (1)


Поскольку не указан тег или язык, я выбираю perl (для преобразования в php: http://www.cs.wcupa.edu/~rkline/perl2php/):

    #!/usr/bin/perl

    use strict;
    use warnings;
    use Data::Dumper;
    use Clone qw(clone);

    sub _minRank
    {
        my ($couple, $tmpInput)    = @_;
        my $minRank                = @$couple[1];

        foreach my $key (keys %{$tmpInput}) {
            my $StudentCouple = $tmpInput->{$key};

            if (@$StudentCouple[0] == @$couple[0] && @$StudentCouple[1] < $minRank) {
                $minRank = @$StudentCouple[1];
            }
        }
        return $minRank;
    }

    sub _maxRank
    {
        my ($couple, $tmpInput)    = @_;
        my $maxRank                = @$couple[1];

        foreach my $key (keys %{$tmpInput}) {
            my $StudentCouple = $tmpInput->{$key};

            if (@$StudentCouple[0] == @$couple[0] && @$StudentCouple[1] > $maxRank) {
                $maxRank = @$StudentCouple[1];
            }
        }
        return $maxRank;
    }

    sub _nbIteration
    {
        my ($couple, $tmpInput)    = @_;
        my $nbIteration            = 0;

        foreach my $key (keys %{$tmpInput}) {
            my $StudentCouple = $tmpInput->{$key};

            if (@$StudentCouple[0] == @$couple[0]) {
                $nbIteration++;
            }
        }

        return $nbIteration;
    }

    sub _computeRank
    {
        my ($couple, $tmpInput) = @_;

        my $tmpInput1   = $tmpInput;
        my $nbIteration = _nbIteration($couple, $tmpInput1);
        my $rank        = @$couple[1];

        if ($nbIteration > 1) {
            my $tmpInput2   = $tmpInput;
            my $minRank     = _minRank($couple, $tmpInput2);

            my $tmpInput3   = $tmpInput;
            my $maxRank     = _maxRank($couple, $tmpInput3);

            $rank = ($minRank + $maxRank) / 2;
        }

        return $rank;
    }

    #         Std_no => [score, rank]
    my %input = (  1 => [50, 1], 
                   4 => [45, 2], 
                   3 => [45, 3], 
                   2 => [45, 4],
                   5 => [45, 5], 
                   6 => [30, 6] );

    my %output = %{clone(\%input)};

    foreach my $key (keys %input) {
        my $StudentCouple  = $input{$key};
        my %tmpInput       = %input;
        my $outputCouple   = $output{$key};

        @$outputCouple[1] = _computeRank($StudentCouple, \%tmpInput);
    }

    print Dumper(\%output);

Я надеюсь, что это поможет вам.

Предупреждение !! этот код не оптимизирован !!

person Xavier S.    schedule 19.08.2013