Vadivel Murugan M
Vadivel Murugan M

Reputation: 105

Rank Calculation in PHP

I want to calculate the rank of the students. Condition for rank calculation is, If two or more students have same total marks they all will get same rank. Then the next rank will start from Previous_rank + Number of Duplicate records.

Here is my code:

<?php
$numbers = array( 101, 201, 301, 301, 401, 501, 501);
rsort($numbers);

$arrlength = count($numbers);
$rank = 1;
   $rt=0;
for($x = 0; $x < $arrlength; $x++) {
    if ($x==0) {
         echo $numbers[$x]."- Rank".($rank);
    }

   elseif ($numbers[$x] != $numbers[($x-1)]) {

            echo $numbers[$x]."- Rank".($rank);
            $rt=$rank;
           }
   else{
        echo $numbers[$x]."- Rank".($rt);
            }
      $rank++;
   echo "<br>";
}
?>

My Expected output is like

501- Rank1
501- Rank1
401- Rank3
301- Rank4
301- Rank4
201- Rank6
101- Rank7

Upvotes: 1

Views: 8409

Answers (4)

Umar Farooque Khan
Umar Farooque Khan

Reputation: 508

PHP code with single loop that works for all cases

rsort($numbers);

$arrlength = count($numbers);
$rank = 1;
$prev_rank = $rank;
for($x = 0; $x < $arrlength; $x++) {
    if ($x==0) {
         echo $numbers[$x]."- Rank".($rank);
    }elseif ($numbers[$x] != $numbers[$x-1]) {
        $rank++;
        $prev_rank = $rank;
        echo $numbers[$x]."- Rank".($rank);
   }else{
        $rank;
        echo $numbers[$x]."- Rank".($prev_rank);
    }
   echo "<br>";
}
?>

Upvotes: 0

Naisa purushotham
Naisa purushotham

Reputation: 913

Still we can reduce loops

 <?php

$numbers = array( 101, 201, 301, 301, 401, 501, 501,601,701,701,701,801,901);
rsort($numbers);
$rank=1;
$prev=$numbers[0];
foreach($numbers as $number){
  if($prev!=$number){
    $prev=$number;
    $rank++;
  }
  echo $number."=>Rank -".$rank."\n";
}
?>

Same output but removed unnecessary loops.

Upvotes: 1

Deepak Visani
Deepak Visani

Reputation: 51

<?php

    $numbers = array( 101, 201, 301, 301, 401, 501, 501,601,701,701,701,801,901);

    rsort($numbers);

    $arr = $arr1 = array();

    foreach ($numbers as $key => $value) {
        $arr[$value][] = $value;
    }

    $i = $j = 1;

    foreach ($arr as $key => $value) {

        foreach ($value as $key1 => $value1) {
            echo $key."- Rank".$i;
            echo "<br>";
            $j++;
        }
    $i = $j;

    }
?>

Upvotes: 3

Ronald Rozema
Ronald Rozema

Reputation: 246

This code does what you want

        <?php
$numbers = array( 101, 201, 301, 301, 401, 401, 401, 501, 501, 501, 501);
rsort($numbers);

$arrlength = count($numbers);
$rank = 1;
$prev_rank = $rank;

for($x = 0; $x < $arrlength; $x++) {

    if ($x==0) {
         echo $numbers[$x]."- Rank".($rank);
    }

   elseif ($numbers[$x] != $numbers[$x-1]) {
        $rank++;
        $prev_rank = $rank;
        echo $numbers[$x]."- Rank".($rank);
   }

   else{
        $rank++;
        echo $numbers[$x]."- Rank".($prev_rank);
    }

   echo "<br>";
}
?>

The problem was with the $rt variable, which you set to 0 but instead should have tracked the previous rank.

Upvotes: 1

Related Questions