gpt4 book ai didi

php - 如何使用字符串中字符的位置来匹配两个字符串

转载 作者:行者123 更新时间:2023-11-29 12:00:26 24 4
gpt4 key购买 nike

我正在开发一个网站,学生可以在该网站上选择一位导师,在特定时间进行特定主题的额外类(class)。

用户陈述了两件事:

  • 他们想要学习的科目
  • 他们可以接受类(class)的时间

学校共有24个科目。平均一个学校周由 5 天组成,每天有 6 个课时。总共 30 小时。

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

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

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

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

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

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

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

  • 一个称为主题,类型为 varchar,长度为 24 个字符、数字。
  • 一个称为“小时”,类型为 varchar,长度为 30 个字符、数字。

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

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

<小时/>

首先,我将存储来自学生的科目小时的输入:

$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的位置后,我可以使用这个数字来选择数据库中相同位置也有1的导师。然后,我将这些用户推送到一个数组中,并按照与最多 1 匹配的用户对它们进行排序:

$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 的位置,并选择之前选择的导师中哪一位在相同位置也有 1他们的工作时间字符串。

但是,我再次认为这不是一个合适的解决方案。我想知道你们中是否有人能找到更好、更高效的方法。

此外,我还使用 AJAX 来检索学生的导师。但提供此脚本并不是必需的。

PS:很抱歉这个标题,无法想出合适的标题来描述我的问题。

最佳答案

我们来谈谈 PHP 中的位串/按位运算和 MySQL .

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

$classes = 0b0101;

该学生正在上 2 和 4 课

如果您想查看用户是否正在学习特定类(class),您可以使用按位与:

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

如果您想运行查询来查找类(class)中的所有用户:

SELECT firstname FROM members WHERE subjects & 0b1000;

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

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

关于php - 如何使用字符串中字符的位置来匹配两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32467635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com