【问题标题】:How to match two strings using the position of a character in this string如何使用此字符串中字符的位置匹配两个字符串
【发布时间】:2015-09-08 21:36:47
【问题描述】:

我正在开发一个网站,学生可以在该网站上在特定时间为特定科目选择辅导老师。

用户陈述了两件事:

  • 他们想要学习的科目
  • 他们能够接受课程的时间

学校共有 24 个科目。平均每周有 5 天,每天有 6 个课时。意味着总共 30 小时。

因此,有 24 门科目和 30 小时可供选择。

经过一番思考,我认为将学生的科目和时间保存在两个单独的字符串中是存储信息的最佳方式。

例如,在字符串主题中。 1 表示选择的主题,0 表示未选择的主题。例如:111100000000000000000000是可能的,学生只选择了前四门科目。字符串 hours 的情况相同,1 表示选择的小时,0 表示未选择。

所以,我得到了两个字符串:

  • 一个称为主题,长度为 24 个字符,数字。
  • 一个称为小时,长度为 30 个字符,数字。

现在,学生当然需要选择导师。这些导师教授的科目和时间都存储在数据库中。同样,主题和时间存储在一个长度为 24 或 30 的长字符串中。

所以,我的数据库中有两个表:

  • 一个叫做subjects,输入长度为24个字符的varchar,数字。
  • 一个叫小时,键入长度为 30 个字符的 varchar,数字。

现在是“困难”的部分,我想不出一种有效的方法来匹配学生和导师。

我一直在研究解决方案,但我认为这不是最好的解决方案。


首先,我将存储来自学生的subjectshours 的输入:

$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:抱歉标题,想不出合适的标题来描述我的问题。

【问题讨论】:

  • 如果 JavaScript 客户端无关紧要,不要标记 JavaScript、jQuery,最好不要标记 AJAX。
  • 您正在有效地使用二进制/位标志。研究按位运算。
  • " 我认为将学生的科目和时间保存在两个单独的字符串中是存储信息的最佳方式。" - 我认为这是一种误解。制作一个科目表和一个将学生与科目联系起来的联结表。
  • 你让我失望了:“平均每天上学 5 天”
  • 对不起,应该是一周,改了@Torge

标签: php mysql


【解决方案1】:

我们来谈谈PHPMySQL中的位串/位运算。

二进制字符串实际上正是您所描述的。为了简化,我们假设只有 4 个类:

$classes = 0b0101;

学生正在上课 2 和 4

如果您想查看用户是否正在上特定的课程,您可以使用按位与:

if ($classes & 0b1000) {
    // user is in class 1
}

如果您想运行查询以查找类中的所有用户:

SELECT firstname FROM members WHERE subjects & 0b1000;

在这些情况下,您可以将主题存储为整数,而不是字符串。

现在这并没有说明它应该如何完成(其他人提到了联结表,这是正确的答案),但是您可以使用位串和按位运算来实现您设计的实现。

【讨论】:

  • 感谢您提出不同的方法,我确实认为我会稍微弄乱连接表。无论如何,谢谢。
猜你喜欢
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多