我正在开发一个网站,学生可以在特定时间为特定科目选择辅导教师。
用户声明了两件事:
学校共有24个科目。一个普通的学校周由5天组成,每个星期有6个班,小时。意思是总共30个小时。
所以,24名科目和30个小时可供选择。
经过一番思考后,我认为以两个单独的字符串保存学生的科目和小时数是存储信息的最佳方式。
例如,在字符串主题中。 A 1表示选择的主题,0表示未选择的主题。例如: 111100000000000000000000 是可能的,学生只选择前四个科目。字符串小时的情况相同,1表示选择的小时数,0表示不是。
所以,我有两个字符串:
现在,学生当然需要辅导老师来选择。这些导师教授的科目和时间存储在数据库中。受试者和小时数再次存储在长度为24或30的长串中。
所以,我的数据库中有两个表:
现在来了" hard"部分,我无法想出一种高效的方式来匹配学生和导师。
我一直致力于解决方案,但我认为这不是最好的解决方案。
首先,我会存储来自学生的subjects
和hours
的输入:
$subjects = $_POST["subjects"];
$hours = $_POST["hours"];
然后我确保那里没有任何奇怪的字符:
$subjects = stripslashes($subjects);
$hours = stripslashes($hours);
$subjects = $mysqli->real_escape_string($subjects);
$hours = $mysqli->real_escape_string($hours);
接下来的事情有点复杂。首先,我将字符串主题分成一个数组。接下来,我将此数组与具有24个1
的数组进行比较。这样做,我知道学生声明的字符串1's
中subjects
的位置:
$subjects = str_split($subjects);
$fullsubjects = array(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
$subjectsresult = array_intersect_assoc($subjects, $fullsubjects);
$subjectskeyresult = array_keys($subjectsresult);
知道1's
的位置,我可以使用这个数字来选择数据库中同样位置1
的导师。然后我将这些用户推送到一个数组中,并按照匹配最多1's
的那些用户进行排序:
$usersubjectsmatch = array();
foreach($subjectskeyresult as $val) {
$nval = 23 - $val;
$fullval = str_repeat("_", $val) . 1 . str_repeat("_", $nval);
$userdataquery = "SELECT firstname FROM members WHERE subjects LIKE '$fullval'";
$userdataresult = $mysqli->query($userdataquery) or die($mysqli->error);
$userdataarray = $userdataresult->fetch_assoc();
$usersubjects = $userdataarray["firstname"];
array_push($usersubjectsmatch, $usersubjects);
}
$ac = array_count_values($usersubjectsmatch);
arsort($ac);
$ordereduserssubject = array_keys($ac);
print_r($ordereduserssubject);
因此,这将输出一组辅导,按大多数匹配排序,以最少匹配。下一步是在学生说明的小时内找到1's
的位置,并选择之前选择的哪位导师在他们的小时字符串中的同一位置也有1
。
但是,再一次,我认为这不是一个合适的解决方案。我想知道你们中间是否有人能找到更好,更有效率的人。
另外,我使用AJAX检索学生的辅导员。但是不必提供此脚本。
PS:对不起标题,无法想出描述我问题的正确标题。
答案 0 :(得分:1)
二进制字符串实际上正是您所描述的内容。为简化起见,我们假装只有4个类:
$classes = 0b0101;
学生正在上课2和4
如果要查看用户是否正在使用特定类,可以使用按位和:
if ($classes & 0b1000) {
// user is in class 1
}
如果要运行查询以查找类中的所有用户:
SELECT firstname FROM members WHERE subjects & 0b1000;
在这些情况下,您可以将主题存储为整数,而不是字符串。
现在这没有说明应该应该如何完成(其他人提到了联结表,这是正确的答案),但你可以使用位串和按位运算来实现您设计的实现。