Пример #1
0
$result->close();
// Read user answers from log.
$log_answers = array();
if ($paper_type == '0') {
    $result = $mysqli->prepare("(SELECT 0 AS type, l.id, l.mark, l.user_answer, lm.userID FROM log0 l, log_metadata lm, users u WHERE lm.userID = u.id AND (u.roles LIKE '%Student%' OR u.roles = 'graduate') AND l.metadataID = lm.id AND l.q_id = ? AND lm.paperID = ? AND lm.started >= ? AND lm.started <= ?) UNION ALL (SELECT 1 AS type, l.id, l.mark, l.user_answer, lm.userID FROM log1 l, log_metadata lm, users u WHERE lm.userID = u.id AND (u.roles LIKE '%Student%' OR u.roles = 'graduate') AND l.metadataID = lm.id AND l.q_id = ? AND lm.paperID = ? AND lm.started >= ? AND lm.started <= ?)");
    $result->bind_param('iissiiss', $q_id, $paperID, $_GET['startdate'], $_GET['enddate'], $q_id, $paperID, $_GET['startdate'], $_GET['enddate']);
} else {
    $result = $mysqli->prepare("SELECT {$paper_type} AS type, l.id, l.mark, l.user_answer, lm.userID FROM log{$paper_type} l, log_metadata lm, users u WHERE lm.userID = u.id AND (u.roles LIKE '%Student%' OR u.roles = 'graduate') AND l.metadataID = lm.id AND l.q_id = ? AND lm.paperID = ? AND lm.started >= ? AND lm.started <= ?");
    $result->bind_param('iiss', $q_id, $paperID, $_GET['startdate'], $_GET['enddate']);
}
$result->execute();
$result->bind_result($type, $id, $mark, $user_answer, $user_id);
while ($result->fetch()) {
    if ($mark !== '') {
        $answer_obj = new enhancedcalc($configObject);
        $answer_obj->set_useranswer($user_answer);
        $answer_obj->set_settings($settings);
        $dist = $answer_obj->get_answer_distance();
        if ($dist === false) {
            $dist = 9999999;
        }
        // Don't include absolutely correct answers in the list
        if ($dist !== '0') {
            //'0.00%'
            $log_answers[] = array('paper_type' => $type, 'id' => $id, 'answer_obj' => $answer_obj, 'mark' => strval($mark), 'user_id' => $user_id, 'distance' => $dist);
        }
    }
}
$result->close();
// Get any existing overrides
$overrides = array();
function storeData(&$log_array, $qID, $answer, $q_type, $display, $settings, $mark, $totalpos, $stop_words, $analysis_type)
{
    $configObject = Config::get_instance();
    if (!isset($log_array[$qID]['mark'])) {
        $log_array[$qID]['mark'] = 0;
    }
    if (!isset($log_array[$qID]['totalpos'])) {
        $log_array[$qID]['totalpos'] = 0;
    }
    switch ($q_type) {
        case 'area':
            if ($mark == $totalpos) {
                if (isset($log_array[$qID]['correct'])) {
                    $log_array[$qID][1]['correct']++;
                } else {
                    $log_array[$qID][1]['correct'] = 1;
                }
            } elseif ($mark < $totalpos and $mark > 0) {
                if (isset($log_array[$qID]['partial'])) {
                    $log_array[$qID][1]['partial']++;
                } else {
                    $log_array[$qID][1]['partial'] = 1;
                }
            } else {
                if (isset($log_array[$qID]['incorrect'])) {
                    $log_array[$qID][1]['incorrect']++;
                } else {
                    $log_array[$qID][1]['incorrect'] = 1;
                }
            }
            $log_array[$qID]['mark'] += $mark;
            $log_array[$qID]['totalpos'] += $totalpos;
            break;
        case 'blank':
            $tmp_answer_parts = array();
            $tmp_answer_parts = explode('|', $answer);
            $i = 0;
            foreach ($tmp_answer_parts as $tmp_individual_answer) {
                $tmp_individual_answer = strtolower(trim($tmp_individual_answer));
                $i++;
                if ($tmp_individual_answer == 'u') {
                    if (isset($log_array[$qID][$i]['u'])) {
                        $log_array[$qID][$i]['u']++;
                    } else {
                        $log_array[$qID][$i]['u'] = 1;
                    }
                } else {
                    if (isset($log_array[$qID][$i][$tmp_individual_answer])) {
                        $log_array[$qID][$i][$tmp_individual_answer]++;
                    } else {
                        $log_array[$qID][$i][$tmp_individual_answer] = 1;
                    }
                }
            }
            break;
        case 'enhancedcalc':
            $configObj = Config::get_instance();
            $calc = new enhancedcalc($configObj);
            $calc->set_settings($settings);
            $calc->set_useranswer($answer);
            if ($calc->is_user_ans_correct() or $calc->is_user_ans_within_fullmark_tolerance()) {
                if (isset($log_array[$qID][1]['correct'])) {
                    $log_array[$qID][1]['correct']++;
                } else {
                    $log_array[$qID][1]['correct'] = 1;
                }
            }
            $log_array[$qID]['mark'] += $mark;
            $log_array[$qID]['totalpos'] += $totalpos;
            break;
        case 'dichotomous':
        case 'true_false':
            $count_answer = strlen($answer);
            for ($i = 0; $i < $count_answer; $i++) {
                $tmp_individual_answer = $answer[$i];
                if (isset($log_array[$qID][$i + 1][$tmp_individual_answer])) {
                    $log_array[$qID][$i + 1][$tmp_individual_answer]++;
                } else {
                    $log_array[$qID][$i + 1][$tmp_individual_answer] = 1;
                }
            }
            break;
        case 'labelling':
            $tmp_first_split = explode(';', $answer);
            $tmp_second_split = explode('$', $tmp_first_split[1]);
            $count_tmp_second_split = count($tmp_second_split);
            for ($i = 2; $i <= $count_tmp_second_split; $i += 4) {
                $x_coord = $tmp_second_split[$i - 2];
                $y_coord = $tmp_second_split[$i - 1];
                $tmp_individual_answer = trim($tmp_second_split[$i]);
                $element = $x_coord . 'x' . $y_coord;
                if (isset($log_array[$qID][$element][$tmp_individual_answer])) {
                    $log_array[$qID][$element][$tmp_individual_answer]++;
                } else {
                    $log_array[$qID][$element][$tmp_individual_answer] = 1;
                }
            }
            break;
        case 'hotspot':
            $layer_answers = explode('|', $answer);
            $layer = 1;
            foreach ($layer_answers as $layer_answer) {
                if (substr($layer_answer, 0, 1) == '1') {
                    if (isset($log_array[$qID][$layer]['1'])) {
                        $log_array[$qID][$layer]['1']++;
                    } else {
                        $log_array[$qID][$layer]['1'] = 1;
                    }
                } elseif (substr($layer_answer, 0, 1) == '0') {
                    if (isset($log_array[$qID][$layer]['0'])) {
                        $log_array[$qID][$layer]['0']++;
                    } else {
                        $log_array[$qID][$layer]['0'] = 1;
                    }
                } else {
                    if (isset($log_array[$qID][$layer]['u'])) {
                        $log_array[$qID][$layer]['u']++;
                    } else {
                        $log_array[$qID][$layer]['u'] = 1;
                    }
                }
                if (!isset($log_array[$qID][$layer]['coords'])) {
                    $log_array[$qID][$layer]['coords'] = $layer_answer;
                } else {
                    $log_array[$qID][$layer]['coords'] .= ';' . $layer_answer;
                }
                $layer++;
            }
            break;
        case 'mcq':
            if (isset($log_array[$qID][1][$answer])) {
                $log_array[$qID][1][$answer]++;
            } else {
                $log_array[$qID][1][$answer] = 1;
            }
            break;
        case 'mrq':
            if ($answer == 'a') {
                if (isset($log_array[$qID]['a'])) {
                    $log_array[$qID]['a']++;
                } else {
                    $log_array[$qID]['a'] = 1;
                }
            } else {
                $count_answer = strlen($answer);
                for ($i = 0; $i < $count_answer; $i++) {
                    $tmp_individual_answer = $answer[$i];
                    if (isset($log_array[$qID][$i + 1][$tmp_individual_answer])) {
                        $log_array[$qID][$i + 1][$tmp_individual_answer]++;
                    } else {
                        $log_array[$qID][$i + 1][$tmp_individual_answer] = 1;
                    }
                }
            }
            $log_array[$qID]['mark'] += $mark;
            $log_array[$qID]['totalpos'] += $totalpos;
            break;
        case 'extmatch':
            $tmp_answer_parts = array();
            $tmp_answer_parts = explode('|', $answer);
            $i = 0;
            foreach ($tmp_answer_parts as $tmp_individual_answer) {
                $i++;
                $tmp_sub_parts = array();
                $tmp_sub_parts = explode('$', $tmp_individual_answer);
                foreach ($tmp_sub_parts as $tmp_individual_part) {
                    if ($tmp_individual_answer == 'u') {
                        if (isset($log_array[$qID][$i]['u'])) {
                            $log_array[$qID][$i]['u']++;
                        } else {
                            $log_array[$qID][$i]['u'] = 1;
                        }
                    } else {
                        if (isset($log_array[$qID][$i][$tmp_individual_part])) {
                            $log_array[$qID][$i][$tmp_individual_part]++;
                        } else {
                            $log_array[$qID][$i][$tmp_individual_part] = 1;
                        }
                    }
                }
            }
            break;
        case 'matrix':
            $tmp_answer_parts = explode('|', $answer);
            $count_tmp_answer_parts = count($tmp_answer_parts);
            for ($i = 0; $i < $count_tmp_answer_parts; $i++) {
                $tmp_individual_answer = $tmp_answer_parts[$i];
                if ($tmp_individual_answer == 'u' or $tmp_individual_answer == '') {
                    if (isset($log_array[$qID][$i + 1]['u'])) {
                        $log_array[$qID][$i + 1]['u']++;
                    } else {
                        $log_array[$qID][$i + 1]['u'] = 1;
                    }
                } else {
                    if (isset($log_array[$qID][$i + 1][$tmp_individual_answer])) {
                        $log_array[$qID][$i + 1][$tmp_individual_answer]++;
                    } else {
                        $log_array[$qID][$i + 1][$tmp_individual_answer] = 1;
                    }
                }
            }
            break;
        case 'rank':
            $tmp_answer_parts = array();
            $tmp_answer_parts = explode(',', $answer);
            $i = 0;
            foreach ($tmp_answer_parts as $tmp_individual_answer) {
                if (isset($log_array[$qID][$i][$tmp_individual_answer])) {
                    $log_array[$qID][$i][$tmp_individual_answer]++;
                } else {
                    $log_array[$qID][$i][$tmp_individual_answer] = 1;
                }
                $i++;
            }
            if ($mark == $totalpos) {
                if (isset($log_array[$qID]['all_correct'])) {
                    $log_array[$qID]['all_correct']++;
                } else {
                    $log_array[$qID]['all_correct'] = 1;
                }
            }
            $log_array[$qID]['mark'] += $mark;
            $log_array[$qID]['totalpos'] += $totalpos;
            break;
        case 'sct':
            if (isset($log_array[$qID][1][$answer])) {
                $log_array[$qID][1][$answer]++;
            } else {
                $log_array[$qID][1][$answer] = 1;
            }
            $log_array[$qID]['mark'] += $mark;
            $log_array[$qID]['totalpos'] += $totalpos;
            break;
        case 'textbox':
            if ($analysis_type == 'top' or $analysis_type == 'bottom') {
                $user_words = str_word_count($answer, 1);
                foreach ($user_words as $word) {
                    $word = strtolower($word);
                    if (!isset($stop_words[$word])) {
                        if (isset($log_array[$qID]['words'][$word])) {
                            $log_array[$qID]['words'][$word]++;
                        } else {
                            $log_array[$qID]['words'][$word] = 1;
                        }
                    }
                }
            }
            if (isset($user_words)) {
                if (isset($log_array[$qID]['word_count'])) {
                    $log_array[$qID]['word_count'] += count($user_words);
                } else {
                    $log_array[$qID]['word_count'] = count($user_words);
                }
            }
            $log_array[$qID]['mark'] += $mark;
            if (is_null($mark)) {
                if (isset($log_array[$qID]['unmarked'])) {
                    $log_array[$qID]['unmarked']++;
                } else {
                    $log_array[$qID]['unmarked'] = 1;
                }
            }
            $log_array[$qID]['totalpos'] += $totalpos;
            break;
        case 'likert':
            if (isset($log_array[$qID][1][$answer])) {
                $log_array[$qID][1][$answer]++;
            } else {
                $log_array[$qID][1][$answer] = 1;
            }
            break;
    }
}