我正在为一个网页构建一个评论功能,其中所有评论都可以包含任意数量的标签(不是HTML标签,但这里的标签是SO,不允许重复),这些标签可以由任何人更新。
假设某条评论包含标记[tag1, tag2, tag3]
,而有人添加了一个标记tag4
,则会删除tag2
。现在,我如何检查新标签集中的旧标签以及可能添加的标签?
我有表comments
,其中包含id
和comment
列(与此问题无关)和comment_tags
表,其中包含id
},tag
和comment_id
列。
我可以将所有旧标记添加到给定注释中,然后循环遍历该数组并使用每个标记检查新标记中包含的标记。如果没有,请删除该标记。然后循环遍历新的标记集,检查旧标记集中包含的每个新标记。如果没有,请将该标记添加到comment_tags
表。
不知何故,这听起来太慢了,我猜测有更好的方法可以做到这一点。所以这是我最初的想法:
$db = new Database();
$purifier = new HTMLPurifier();
$existing_tags = $db -> get_comment_tags($_POST['comment_id']);
$new_tags = $purifier -> purify($_POST['tags']);
$new_tags = explode(" ", $new_tags);
$new_tags = array_unique($new_tags);
/* Delete tags that were not included in the new set of tags */
foreach ($existing_tags as $tags => $tag) {
if (!in_array($tag['tag'], $new_tags)) {
$db -> delete_comment_tag($existing_tags[$tags]['id']);
}
}
/* Since get_comment_tags returns array which contains arrays,
let's strip unnecessary info */
$filtered_existing_tags = array();
foreach ($existing_tags as $key => $value) {
$filtered_existing_tags[] = $value['tag'];
}
/* Add tags that were not included in the old set of tags */
foreach ($new_tags as $key => $value) {
if (!in_array($value, $filtered_existing_tags)) {
$db -> add_comment_tag($_POST['comment_id'], $value);
}
}
答案 0 :(得分:1)
我通常会在posts_tags
表上运行两个SQL查询来实现这一点:一个用于删除当前链接到帖子的所有标记,另一个用于插入所有当前有效的标记。