如何在php/laravel中获取数组中元素的位置

2sbarzqh  于 2023-01-06  发布在  PHP
关注(0)|答案(3)|浏览(142)

所以我有一个
学生模型、科目模型、分数模型,其中有总分字段
我想做的是得到一个班每个学生的考试总分,然后根据班上的最高分检索结果,然后将这些分数定位为1,2,3...
最后得到单个学生的位置并将其存储在考试记录表中。
到目前为止,我已经能够获得每个学生的考试总分,将它们存储在数组中,根据最高分排序,
现在唯一让我头疼的问题是从数组中获取这些分数的位置,我的问题是如何获取学生分数的位置,或者是否有方法将位置添加到分数中,然后检索学生的位置
例如
这是我的代码下面,请任何人有一个想法如何解决这个我需要你的帮助。

TextInput::make('position')->numeric(
            function (Closure $set) {
            // Get all students from class
            $studentsInClass = $this->class->students;
            
            //empty array to store student's total_score
            $totalScore = [];
            
           // loop through students get all their total_score on all subjects from mark table and sum it, then store it 
           in totalScore array.
            foreach ($studentsInClass as $key => $student) {
              
          $totalScore[] = array('student_id' => $student->id, 'total_score' => $student->marks->sum('total_score') );
            }
            // Sort scores from highest to lowest
            $sortedScores= array_values(array_reverse(Arr::sort($totalScore, function ($value) {
                return $value['total_score'];
            })));

            // get the current student Id 
            $id = $this->student->id;
            // find a student in the array that matches the current student id and return his score.
            //so this is where I would like to return the score and position of the student 
            $filteredArray = Arr::where($sortedScores, function ($value, $key) use ($id) {
                return $value['student_id'] == $id;
            });
          
        }
        )->disabled(),

如果您添加了($sortedScores)

ddhy6vgd

ddhy6vgd1#

你有一个二维数组。

$sortedScores = [
  ['student_id'  => 2, 'total_score' => 443],
  ['student_id'  => 4, 'total_score' => 410],
  ['student_id'  => 1, 'total_score' => 371],
  ['student_id'  => 3, 'total_score' => 170],
];

每一行的索引从0-3已经是连续的。我想你想给这些行加一个秩。

foreach($sortedScores as $idx => $row)
  $sortedScores[$idx]['rank'] = $idx+1;

//test output
var_export($sortedScores);

输出:

array (
  0 => 
  array (
    'student_id' => 2,
    'total_score' => 443,
    'rank' => 1,
  ),
  1 => 
  array (
    'student_id' => 4,
    'total_score' => 410,
    'rank' => 2,
  ),
  2 => 
  array (
    'student_id' => 1,
    'total_score' => 371,
    'rank' => 3,
  ),
  3 => 
  array (
    'student_id' => 3,
    'total_score' => 170,
    'rank' => 4,
  ),
)

如果你想让rank从0开始,只需要赋值$idx。
https://3v4l.org/9Dv7D上试用
我希望这对你有帮助,并且我正确地理解了你的问题。
若要在多维数组中查找特定值的键,请参见“PHP Multidimensional Array Searching (Find key by specific value)

sqxo8psd

sqxo8psd2#

你可以使用array_search()函数,它返回你要找的值的键,如果它不在数组中,则返回false。

$letters = ['a', 'b', 'c', 'd'];
$key = array_search('b', $letters);
//In this case $key will equal to 2.
0ejtzxu1

0ejtzxu13#

假设$filteredArray包含单个项,那么第一个键应该是学生在排序数组中的位置。

$position = array_keys($filteredArray)[0];

相关问题