Reputation: 105
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
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
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
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
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