unset($dis[$i]['kms'][$key]); continue; } } if (empty($km['min_ball'])) { $km['min_ball'] = 0; } //Для лучшего отображения if ($km['week'] == $set['week'] && $set['week'] != 18) { $dis[$i]['nowkm'] = true; } //Наличие КМ на текущей неделе //Обработка балла $b = end(RPU::filterBy($ball[$d['id_link']], array('id_km' => $km['id'], 'numst' => $numst))); //Балл за текущее КМ $km['ball'] = RPU::solveGrade($b['ball'], $km['max_ball']); //Полная информация о оценке и т.д. $km['ball']['tutor'] = $dis[$i]['preps'][$b['creator']]['name'] ? $dis[$i]['preps'][$b['creator']]['name'] : 'N/A'; if (is_null($km['ball']['b'])) { //Если балл не стоит, то нужен прочерк $km['ball']['b'] = '-'; $km['ball']['o'] = $km['week'] < $set['week'] ? 'n' : 'f'; //Если балл не стоит на будующей неделе, показываться вообще не будет } if ($km['ball']['b'] == '-1') { $km['ball']['b'] = 'н'; } $dis[$i]['kms'][$key] = $km; } $dis[$i]['kms'] = RPU::matrixSort($dis[$i]['kms'], 'week'); if (empty($dis[$i]['kms'])) {
/** * Рассчёт МВБ и суммарных оценок студентов. * <b>Внимание!</b> Массив дисциплин дожен содержать информацию о перезачётах. * @param array $tpds то что возвращается функцией <a href="#upDises">upDises</a> * @param array $balls то что возвращается функцией <a href="#getBalls">getBalls</a> * @param array $students то что возвращается функцией <a href="#getStudents">getStudents</a> * @param int $week неделя * @return array [ [ <то что было в массиве> grades=>[numst,o,b,p],mvb,mvbi] ] */ public static function upgradeGrades($tpds, $balls, $students, $week) { $week = $week < 18 ? $week : 19; $getNumst = function ($a) { return $a['numst']; }; /*Для оптимизации*/ $students = RPU::groupBy($students, 'gr'); foreach ($balls as $k => $v) { $ba[$k] = RPU::groupBy($v, 'id_km'); } $balls = $ba; /*--------------*/ foreach ($tpds as $key => $tpd) { $tpds[$key]['mvb'] = array(); $all_sob = array(); $st_of_gr = array(); $n_of_gr = array(); foreach ($tpd['groups'] as $gr) { $st_of_gr[$gr] = $students[$gr]; $n_of_gr[$gr] = array_map($getNumst, $st_of_gr[$gr]); //RPU::reshape($st_of_gr[$id_gr],false,'numst'); } foreach ($tpd['kms'] as $id_gr => $gr_kms) { $gr_mvb = 0; $gr_mvbi = 0; $gr_num_km = 0; foreach ($gr_kms as $km) { if ($km['week'] < $week) { $_balls = $balls[$tpd['id_link']][$km['id']]; $gr_num_km++; $flag = empty($_balls); //$gr_st=RPU::filterBy($students,array('gr'=>$id_gr)); //$gr_st=RPU::reshape($st_of_gr[$id_gr],false,'numst'); #=============================================================================================== foreach ($_balls as $ball) { $numst = $ball['numst']; if (!in_array($numst, $n_of_gr[$id_gr])) { continue; } if (!isset($all_sob[$numst])) { $all_sob[$numst] = array('count_km' => 0, 'sob' => 0, 'sob_bonus' => 0); } if ($ball['ball'] and $ball['ball'] != -1) { $all_sob[$numst]['count_km']++; if (!$km['bonus']) { $all_sob[$numst]['sob'] += $ball['ball']; } else { $all_sob[$numst]['sob_bonus'] += $ball['ball']; } } } #=============================================================================================== if (($week == 19 or !$flag) and !$km['bonus']) { $gr_mvb += (double) $km['max_ball']; $gr_mvbi += (double) $km['min_ball']; } } } //================ group $tpds[$key]['mvb'][$id_gr] = $gr_mvb > 100 ? 100 : $gr_mvb; $tpds[$key]['mvbi'][$id_gr] = $gr_mvbi; //$gr_students=RPU::filterBy($students,array('gr'=>$id_gr)); foreach ($st_of_gr[$id_gr] as $one_student) { $mvb = $tpds[$key]['mvb'][$id_gr]; $sob = 0; $numst = $one_student['numst']; if (isset($all_sob[$numst])) { $_sob = $all_sob[$numst]; $sob = $_sob['sob']; if ($_sob['count_km'] == $gr_num_km) { $sob += $_sob['sob_bonus']; } $sob = $sob > $mvb ? $mvb : $sob; } elseif (isset($tpd['offset'][$numst])) { $sob = $tpd['offset'][$numst]; } else { $sob = 0; } $grade = RPU::solveGrade($sob, $mvb); $grade['numst'] = $numst; $tpds[$key]['grades'][$numst] = $grade; } } } return $tpds; }
} $body = array(); $i = 0; foreach ($stud as $numst => $name) { if ($iup and $iup['numst'] != $numst) { continue; } if (!empty($dis['preps']['st']) and !in_array($numst, $dis['preps']['st'])) { continue; } $body[$i]['name'] = $name; $body[$i]['numst'] = $numst; $body[$i]['text'] = false; if (isset($dis['offset'][$numst])) { if ($dis['offset'][$numst] != '50') { $grad = RPU::solveGrade($dis['offset'][$numst], 100); $text = 'дисциплина перезачтена c оценкой ' . $grad['o']; } else { $text = 'дисциплина перезачтена'; } $body[$i++]['text'] = $text; $no_show[$numst] = true; continue; } if ($dis['vdv'] and !in_array($numst, $dis['numsts'])) { $body[$i++]['text'] = 'Студент не выбрал данную дисциплину для изучения'; $no_show[$numst] = true; continue; } $un = RPU::filterBy($unvis, array('numst' => $numst)); $u = array();