Как создать новый массив на основе повторяющихся значений массива и вычислить среднее значение? - PullRequest
0 голосов
/ 23 октября 2019

Я создаю систему обратной связи, в которой учащиеся вводят обратную связь для учителей, а затем вычисляют среднее значение для каждого класса и соответствующих предметов. Как мне это сделать?

Array
(
    [0] => Array
        (
            [empName] => Shahrukh Khan
            [class] => Bachelor in Computer Applications 1st Year
            [subjectName] => Basic Mathematics
            [average] => 60
        )

    [1] => Array
        (
            [empName] => Shahrukh Khan
            [class] => Bachelor in Commerce 1st Year
            [subjectName] => Basic Mathematics
            [average] => 60
        )

    [2] => Array
        (
            [empName] => Anshu Sharma
            [class] => Bachelor in Computer Applications 1st Year
            [subjectName] => Operating System
            [average] => 75
        )

)

Я получаю это как вывод.

foreach ($result as $key => $value) {
    $query = $this->Admin_model->getFeedbackReport($value->emp_uid,$value->subjectId,$month,$this->feedback1);

        $excel = 0; $good = 0; $fair = 0;
        foreach ($query as $key => $val) {
            if($val->rating == "Excellent")
                $excel = $excel+1;
            elseif($val->rating == "Good")
                $good = $good+1;     
            else
                $fair = $fair+1;

        }
        $finalAverage =0;
        //echo $excel."<br>"; echo $good."<br>"; echo $fair;
        $total = $excel+$good+$fair;
        $excelWeight = $excel * 2;
        $goodWeight = $good * 1;
        $fairWeight = $fair * 0;
        $marksGained = $excelWeight+$goodWeight+$fairWeight;
        $maxScore = $total*2;
        $average = round($marksGained/$maxScore * 100); 
        $data[]= array(
            'empName'       => $value->emp_name, 
            'class'         => $value->course_name." ".$value->class_name,
            'subjectName'   => $value->subjectName,
            'average'       => $average
        );
    }        
    //print_r($data);

Я ожидаю, что везде, где empName одинаково, среднее (то есть: 60) получает прибавление и усреднениерассчитывается (то есть 60 + 60/2).

Ожидаемый результат -

+------+---------------+---------------------------------------+-----------------------+---------+-------+
| S.No |     Name      |                 Class                 |        Subject        | Average | Final |
+------+---------------+---------------------------------------+-----------------------+---------+-------+
|    1 | Shahrukh khan |  Bachelor in Commerce 1st Year        | Basic Mathematics     |      60 |    60 |
|    2 | Anshu Sharma  | Bachelor in Computer Applications 1st | Year Operating System |      75 |    75 |
+------+---------------+---------------------------------------+-----------------------+---------+-------+

1 Ответ

0 голосов
/ 24 октября 2019

На самом деле, Sunject, Class и Average могут повторяться, как я вижу.

Это решение основано на наборе unique empNames, обработке index первого появления и суммировании средних значений.

Разместите $ar_emp = []; $ar_s = []; перед оператором foreach, а затем замените:

$data[]= array(
    'empName'       => $value->emp_name, 
    'class'         => $value->course_name." ".$value->class_name,
    'subjectName'   => $value->subjectName,
    'average'       => $average
);    

на приведенный ниже код:

$val_ename = $value->emp_name;
$val_class = $value->course_name." ".$value->class_name;
$val_sname = $value->subjectName;
$val_avera = $average;

if (!in_array($val_ename, $ar_emp)) { 

    array_push($ar_emp, $val_ename); 

    $ar_s[$val_ename] = array (
          'coun'      => 1,
          'average'   => $val_avera,
          'inde'      => $key 
    );

    $data[]= array(
        'empName'       => $val_ename, 
        'class'         => $val_class,
        'subjectName'   => $val_sname,
        'last_average'  => $val_avera,
        'final'         => $val_avera
    ); 

} else {

    $ar_s[$val_ename]['coun'] += 1;
    $ar_s[$val_ename]['average'] += $val_avera;

    $data[$ar_s[$val_ename]['inde']]= array(
                    'empName'       => $val_ename, 
                    'class'         => $val_class,
                    'subjectName'   => $val_sname,
                    'last_average'  => $val_avera,
                    'final'         => ($ar_s[$val_ename]['average'] / $ar_s[$val_ename]['coun'])
    );               
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...