Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取所有相关标签?_Php_Loops - Fatal编程技术网

Php 获取所有相关标签?

Php 获取所有相关标签?,php,loops,Php,Loops,这很棘手。我有一个表,有两列:thread\u-tag\u-map:thread\u-id和tag\u-name thread_id tag_name 1 football 1 manchester 2 manchester 2 england 3 england 3 queen 4 queen 4 diana 正如您所看到的,一个

这很棘手。我有一个表,有两列:thread\u-tag\u-map:thread\u-id和tag\u-name

  thread_id tag_name
  1         football
  1         manchester
  2         manchester
  2         england
  3         england
  3         queen
  4         queen
  4         diana
正如您所看到的,一个线程可以有多个标记,这给了我们标记的链接效果

如果您键入标记football,我希望它显示所有与football相关的标记。也就是说,曼彻斯特、英格兰、女王和戴安娜

以下是我到目前为止的编码:

    // get all thread_id:s for tag_name
    $query = "SELECT *
            FROM thread_tag_map
            WHERE tag_name = 'football'";

    $result1 = mysqli_query($conn, $query) or die ("Couldn't execute query: " . mysqli_error($conn));

    // get all tag_name:s for each thread_id
    while($row = mysqli_fetch_assoc($result1))
    {
        $thread_id = $row['thread_id'];

        $query = "SELECT *
                FROM thread_tag_map
                WHERE thread_id = $thread_id";

        $result2 = mysqli_query($conn, $query) or die ("Couldn't execute query: " . mysqli_error($conn));

    // add each tag to array
    while($row = mysqli_fetch_assoc($result2))
    {
        $tag_array[] = $row['tag_name'];
      }
   }
但这给了我足球和曼彻斯特。我不知道如何才能使它成为一个好的代码来循环?它通过了。可能有100个相关标签


我想你理解这个想法。以前有人这样做过吗?

如果你正在构建某种论坛/讨论板,如果“相关标签”指的是发布在与某个论坛/论坛相关的线程中的所有标签,那么将它们全部选中不是更容易吗?因为您是基于线程创建标记的,所以它们都应该正确放置,所以您只需要获取它们


此外,我建议您为此目的创建一个临时表,一旦需要相关标记,您就在其中存储它们,将数组保存在该表中以供将来搜索,并在某个新词作为标记时进行更新

你可以用图论把你想做的事情形式化。您希望所有连接的节点都连接到给定的节点,给定某种邻接列表。 要做到这一点,您需要对图形进行广度优先搜索。这对于避免循环非常重要

不过,您选择的表示方式并不完全有效,但肯定可以工作

在伪代码中,您的算法应该如下所示:

interesting-tags = input-tag
output = empty
for tag in interesting-tags:  (Must be in order)
    select related-tags to tag
    for newtag in related-tags:
        if newtag is not in output:
             append newtag to interesting-tags and output

return output
所以在这里,有趣的标签应该是队列的某种形式,因为您需要在后面添加新项目,并从前面获取它们

输出应该是一个集合数据类型,因为您需要检查集合中是否已有内容,并添加它们

但是,我不熟悉PHP,所以我不知道您可以使用什么。至少,您可以只使用一个数组来实现所需的操作,即使它可能不是完全有效的,但它只适用于几个标记