首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用递归检索父节点?

问如何使用递归检索父节点?
EN

Stack Overflow用户
提问于 2011-09-07 20:48:43
回答 1查看 3.3K关注 0票数 2

我创建了一个递归函数来获取产品的父产品。我几乎可以肯定我就快做到了,但是需要帮助我从递归中恢复过来。

我想要的结果是:

代码语言:javascript
复制
Product 1 (id:1, parent:none)

Product 2 (id:2, parent:1)

--- --- Product 3 (id:3, parent:2)

--- --- Product 4 (id:4, parent:2)

--- Product 5 (id:5, parent:1)

--- --- Product 6 (id:6, parent:5)

--- --- Product 7 (id:7, parent:5)

我更新的函数如下:

代码语言:javascript
复制
function get_parents ($pid, $found = array()) {
    array_push ($found, $pid);

    $sql = "SELECT * FROM products WHERE child_id = '$pid'";
    $result = mysql_query($sql) or die ($sql);

    if(mysql_num_rows($result)){
        while($row = mysql_fetch_assoc($result)){
            $found[] = get_parents($row['pid'], $found);
        }
    }
    return $found;
}

我使用一个简单的方法来调用它:

代码语言:javascript
复制
$parents = get_parents($pid);

我遇到的问题是,当我运行它时,它会创建一个无限循环,这个循环不会中断。

我不想完成垃圾邮件,所以我将数组的结果保存到一个文本文件中,可以在这里看到http://vasa.co/array.txt

我们将非常感谢您的帮助:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-08 23:13:46

嗯..。从你的数据库结构来看,似乎有什么地方不对劲,除非我漏掉了什么

这句话

代码语言:javascript
复制
$sql = "SELECT * FROM products WHERE child_id = '$pid'";

告诉我对于每个产品,您都存储了孩子的ID。通常,在基于树的结构中,情况正好相反,您存储的是父ID而不是子节点-除非您希望一个子节点具有多个父节点。如果是这种情况,那么这个函数很容易就会遇到问题。请考虑以下几点:

代码语言:javascript
复制
| ID | Child_ID |
+----+----------+
| 1  | 2        |
| 2  | 1        |

这将导致无限循环。如果您存储parent_id,那么从本质上讲,您将对图进行分层编码。因为每个产品都有父元素,所以可以递归地编写逻辑。

然后可以这样写吗?

代码语言:javascript
复制
function get_parents ($pid, $found = array()) {
    array_push ($found, $pid);

    $sql = "SELECT * FROM products WHERE id = '$pid'";
    $result = mysql_query($sql) or die ($sql);

    if(mysql_num_rows($result)){
        while($row = mysql_fetch_assoc($result)){
            $found[] = get_parents($row['parent_id'], $found);
        }
    }
    return $found;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7334138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档