mismatch_mymismatch 最佳匹配条形图
作者:互联网
<?php
//统计图 条形显示不出来 ,排查可能是绘制图形时出了问题 将类别转为二维数组 循环生成条形图
error_reporting( E_ALL&~E_NOTICE ); //未定义变量时会报错 加上这个
require_once('comment/startsession.php');
$title = "Quistionaire";
require_once('comment/header.php');
if(!isset($_SESSION['user_id'])){
echo '<p>Please <a href="userlogin.php">Log In</a> to access this page.</p>';
exit();
}
require_once('comment/navmenu.php');
require_once('dbc.php');
//第一步当用户有响应时创建一个登录用户响应表 response_id topic_id response,topic_name
$query = "select * from match_response where user_id = '".$_SESSION['user_id']."'";
$data = mysqli_query($dbc,$query);
if (mysqli_fetch_array($data) != 0) {
$query = "select mr.response_id,mr.topic_id,mr.response,mt.name as topic_name,mc.name as category_name from match_response as mr INNER JOIN match_topic AS mt USING (topic_id)INNER JOIN match_category as mc USING (category_id) WHERE mr.user_id = '".$_SESSION['user_id']."'";
// echo $query;
$data = mysqli_query($dbc,$query);
$user_response = array();
while ($row=mysqli_fetch_array($data)) {
array_push($user_response,$row);
}
// echo '<pre>';
// var_dump($user_response);
//创建变量用于对比跟储存
$mismatch_score = 0; //分数
$mismatch_user_id = -1; //其他用户
$mismatch_topics = array();//主题
//第二步查找其他用户的响应数据
$query = "select user_id from match_user where user_id != '".$_SESSION['user_id']."'";
$data = mysqli_query($dbc,$query);
while ($row=mysqli_fetch_array($data)) { //循环查找用户
// echo $row['user_id'].'<br>';
//查找其他用户的响应生成$mismatch_responses
// $query2 = "SELECT mr.response_id, mr.topic_id, mr.response, mt.name AS topic_name, mc.name AS category_name FROM match_response AS mr INNER JOIN match_topic AS mt USING ( topic_id ) INNER JOIN match_category AS mc USING ( category_id ) WHERE user_id = '".$row['user_id']."'";
$query2 = "select response_id, response, topic_id from match_response where user_id = '".$row['user_id']."'";
$data2 = mysqli_query($dbc,$query2);
$mismatch_responses = array();
while ($row2=mysqli_fetch_array($data2)) {
array_push($mismatch_responses, $row2);
}
// var_dump($mismatch_responses);//1 3 4
//将两个表格进行比对 1+2=3记录到score中,主题保存到数组 //int将2转为整数
$score = 0;
$topics = array();
$categories = array();
for ($i=0; $i < count($user_response); $i++) {
if (((int)$user_response[$i]['response']) + ((int)$mismatch_responses[$i]['response']) == 3) {
$score += 1;
array_push($topics,$user_response[$i]['topic_name']);
array_push($categories,$user_response[$i]['category_name']);
}
}
// print_r($topics);
// print_r($categories);
// foreach ($categories as $categorie) {
// if (empty($categorie)) {
// unset($categorie);
// }
// }
// print_r($categories);
//对比分数取最大分数
if ($score > $mismatch_score) {
$mismatch_score = $score;
$mismatch_user_id = $row['user_id']; //记录匹配的用户id
$mismatch_topics = array_slice($topics,0);//array_slice()从数组中抽取一片 这里直接复制数组
$mismatch_categories = array_slice($categories,0);//array_slice()从数组中抽取一片 这里直接复制数组 去除空数组
}
}
// print_r($mismatch_topics).'<br>';
// print_r($mismatch_user_id).'<br>';
// print_r($mismatch_categories);
//将类别转化为一个二维数组 新的从1开始,旧的在此之前上+1 数组从0开始需要-1
$category_totals = array(array($mismacth_categories[0],0));//类别和汇总数初始化第一个元素
foreach ($mismatch_categories as $category) {
// var_dump($category);
//数组从0开始,所以数组中的最后一个元素总是-1
if($category_totals[count($category_totals)-1][0] != $category){
//新类别,作为一个新的子数组添加到类别总
array_push($category_totals, array($category,1));
}else{
//类别数+1
$category_totals[count($category_totals)-1][1]++;
}
}
// print_r($category_totals);
// die();
if ($mismatch_user_id != -1) {
$query = "select username,first_name,last_name,city,state,picture from match_user where user_id = '".$mismatch_user_id."'";
// echo $query;
$data = mysqli_query($dbc,$query);
if (mysqli_num_rows($data)==1) {
$row = mysqli_fetch_array($data);
// var_dump($row);
//展示匹配的用户信息
echo '<table><tr><td class="lable">';
if (!empty($row['first_name'] && !empty($row['last_name']))) {
echo $row['first_name'].' '.$row['last_name'].'<br>';
}
if (!empty($row['city'] && !empty($row['state']))) {
echo $row['city'].' '.$row['state'].'<br>';
}
echo '</td><td>';
if (!empty($row['picture'])) {
echo '<img src="'.UPLOADPATH.$row['picture'].'" alt="'.$row['picture'].'" width="100px" height="100px"/><br>';
}
echo '</td></tr></table>';
//展示匹配的主题
echo '<h4>You are mismatch on the following '.count($mismatch_topics).' topics: </h4>';
foreach ($mismatch_topics as $topic) {
echo $topic.'<br>';
}
//输出直方图
echo '<h4>Mismatched category brekdown</h4>';
draw_bar_graph(480,240,$category_totals,5,UPLOADPATH.$_SESSION['user_id'].'-mymismatchgraph.png');
echo '<img src="'.UPLOADPATH.$_SESSION['user_id'].'mymismatchgraph.png" alt="Mismatch category graph"><br>';
// 用户链接
echo '<h4>Viwe <a href="mismatch_viewprofile.php?user_id='.$mismatch_user_id.'">'.$row['first_name'].'\' s profile </a>.</h4>';
}
}
}
else{
echo '<p>You must first<a href="mismatch_questionnaire.php"> anser the questionnaire </a> before you can be mismatched.</p>';
}
require_once('comment/footer.php');
//直方图函数 宽 高 二维数组 最大范围值 文件名
function draw_bar_graph($width,$height,$data,$max_value,$filename){
// echo $width.'<br>';
// echo $height.'<br>';
// // echo '<pre>'.'<br>';
// print_r($data).'<br>';
// echo $max_value.'<br>';
// echo $filename.'<br>';
$img = imagecreatetruecolor($width, $height);//空图形
//定义颜色
$bg_color = imagecolorallocate( $img,255,255,215);//white
$text_color = imagecolorallocate($img,255,255,255);
$bar_color = imagecolorallocate($img,0,0,0);//black
$border_color = imagecolorallocate($img,192,192,192);//light gray
//清空背景
imagefilledrectangle($img,0,0,$width,$height,$bg_color);
//绘制矩形
// echo count($data); //6
$bar_width = $width/((count($data) *2) +1);
// $bar_width = $width/11;
// echo $bar_width.' '.$data[1][1];//图片显示不出来
for ($i = 0; $i< count($data); $i++) {
//绘制矩形 imagefilledrectangle(img,0,0,captcha_width,captcha_height,color)
imagefilledrectangle($img,($i*$bar_width *2)+($bar_width),$height,($i*$bar_width*2) + ($bar_width*2),$height-(($height/$max_value)*$data[$i][1]),$bar_color);
//将矩形变成直条
imagestringup($img, 5, ($i*$bar_width*2)+($bar_width), $height-5,$data[$i][0], $text_color);
}
// imagefilledrectangle($img,0,0,74,200,$bar_color);
//将整个直方图外围绘制成一个矩形
imagerectangle( $img,0,0,$width-1,$height-1,$bar_color);
for ($i =1; $i<=$max_value ; $i ++) { //在直方图左上边界绘制文本串 img 字体范围,串左上角的xy坐标,文本串,颜色
imagestring($img,5,0,$height-($i*($height/$max_value)),$i,$bar_color);
}
//写文件
imagepng($img,$filename,5);//压缩级别1-9
imagedestroy($img);
}
?>
标签:mismatch,echo,user,response,mymismatch,array,id,条形图 来源: https://blog.csdn.net/qq_39612654/article/details/115050219