Royal Posted July 13, 2023 Share Posted July 13, 2023 Hello guys, i need help to generate students class position in a class broadsheet based on their individual exam totals, the results are being populated from the database and everything works fine but i do not know how to generate the position on the fly from the grand totals generated from the database and store in a $total variable for each student. below is my code <?php include_once('../controller/config.php'); if (isset($_POST['view'])) { $term1 = $_POST['term']; $year1 = $_POST['year']; $class1 = $_POST['class']; $sql1 = "SELECT * FROM student_exam_result where year = '$year1' and class = '$class1' and term = '$term1'"; $result1=mysqli_query($conn,$sql1); $row1=mysqli_fetch_assoc($result1); $subject1 = $row1['subject1']; $subject2 = $row1['subject2']; $subject3 = $row1['subject3']; $subject4 = $row1['subject4']; } ?> <h3 style="text-align:justify !important; font-weight:bolder" class="box-title"><?php echo "$term1 ";?>RESULT BROADSHEET FOR CLASS <?php echo "$class1 ";?><?php echo"$year1";?> </h3> </div><!-- /.box-header --> <div class="box-body table-responsive"> <table style="width:100%" id="example1" class="table table-bordered table-striped"> <thead> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-1">ID</th> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3">Student Name</th><th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3">Index Number</th> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3"><?php echo $subject1; ?></th> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3"><?php echo $subject2; ?></th> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3"><?php echo $subject3; ?></th> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3"><?php echo $subject4; ?></th> <th style="background-color: gray;color: white; text-transform: uppercase;" class="col-md-3">Grand Total</th> <th style="background-color: gray;color: white; text-transform: uppercase;"class="col-md-8">Class Position</th> </thead> <tbody> <?php include_once('../controller/config.php'); if (isset($_POST['view'])) { $term = $_POST['term']; $year = $_POST['year']; $class = $_POST['class']; $sql = "SELECT * FROM student_exam_result where year = '$year' and class = '$class' and term = '$term' ORDER BY id DESC"; $result=mysqli_query($conn,$sql); $count=0; if(mysqli_num_rows($result) > 0){ while($row=mysqli_fetch_assoc($result)){ $count++; $subject1_total = $row['subject1_test1_score'] + $row['subject1_test2_score'] + $row['subject1_exam_score']; $subject2_total = $row['subject2_test1_score'] + $row['subject2_test2_score'] + $row['subject2_exam_score']; $subject3_total = $row['subject3_test1_score'] + $row['subject3_test2_score'] + $row['subject3_exam_score']; $subject4_total = $row['subject4_test1_score'] + $row['subject4_test2_score'] + $row['subject4_exam_score']; $total = $row['grand_total']; ?> <tr> <td><?php echo $count; ?></td> <td> <?php echo $row['name']; ?> </td> <td> <?php echo $row['index_number']; ?> </td> <td> <?php echo $subject1_total; ?></td> <td> <?php echo $subject2_total; ?></td> <td> <?php echo $subject3_total; ?></td> <td> <?php echo $subject4_total; ?></td> <td> <?php echo $total; ?></td> <td><?php echo $position?> </td> </tr> <?php } } } ?> </tbody> </table> </div><!-- /.box-body --> Below is the php code i used to calculate the position // Sample array of students and their exam totals $studentScores = array($total); // Sort the array in descending order of scores arsort($studentScores); // Get the positions of students $positions = array(); $position = 1; $prevScore = null; foreach ($studentScores as $student => $score) { if ($prevScore !== null && $score < $prevScore) { $position++; } $positions[$student] = $position; $prevScore = $score; } // Print the positions of students foreach ($positions as $student => $position) { echo $position . PHP_EOL; } But it gives me 1 as every students position. Please how do i solve this Quote Link to comment https://forums.phpfreaks.com/topic/317078-issue-generating-student-class-position-based-on-the-grand-exam-score/ Share on other sites More sharing options...
Barand Posted July 13, 2023 Share Posted July 13, 2023 Here's one way $student_scores = [ [ 'name' => 'Student A', 'score' => 68, 'pos' => '' ], [ 'name' => 'Student B', 'score' => 52, 'pos' => '' ], [ 'name' => 'Student C', 'score' => 73, 'pos' => '' ], [ 'name' => 'Student D', 'score' => 80, 'pos' => '' ], [ 'name' => 'Student E', 'score' => 56, 'pos' => '' ], [ 'name' => 'Student F', 'score' => 77, 'pos' => '' ], [ 'name' => 'Student G', 'score' => 73, 'pos' => '' ], [ 'name' => 'Student H', 'score' => 49, 'pos' => '' ], [ 'name' => 'Student I', 'score' => 88, 'pos' => '' ], [ 'name' => 'Student J', 'score' => 90, 'pos' => '' ] ]; $scores = array_column($student_scores, 'score'); rsort($scores); foreach ($student_scores as &$s) { $s['pos'] = array_search($s['score'], $scores) + 1; } // sort scores by position uasort($student_scores, fn($a, $b) => $a['pos']<=> $b['pos']); // show results echo '<pre>' . print_r($student_scores, 1) . '</pre>'; giving Array ( [9] => Array ( [name] => Student J [score] => 90 [pos] => 1 ) [8] => Array ( [name] => Student I [score] => 88 [pos] => 2 ) [3] => Array ( [name] => Student D [score] => 80 [pos] => 3 ) [5] => Array ( [name] => Student F [score] => 77 [pos] => 4 ) [2] => Array ( [name] => Student C [score] => 73 [pos] => 5 ) [6] => Array ( [name] => Student G [score] => 73 [pos] => 5 ) [0] => Array ( [name] => Student A [score] => 68 [pos] => 7 ) [4] => Array ( [name] => Student E [score] => 56 [pos] => 8 ) [1] => Array ( [name] => Student B [score] => 52 [pos] => 9 ) [7] => Array ( [name] => Student H [score] => 49 [pos] => 10 ) ) 1 Quote Link to comment https://forums.phpfreaks.com/topic/317078-issue-generating-student-class-position-based-on-the-grand-exam-score/#findComment-1610470 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.