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

Php 如何使用递归检索父节点?,php,recursion,Php,Recursion,我创建了一个递归函数来获取产品的父产品。我几乎可以肯定我就快到了,但是需要帮助从递归中恢复 我想要的结果是: 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:

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

我想要的结果是:

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)
我更新的功能如下:

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;
}
我用一个简单的方法称之为:

$parents = get_parents($pid);
我遇到的问题是,当我运行它时,它会创建一个无限循环,而这个循环不会中断

我不想因为垃圾邮件而完蛋,所以我将数组的结果保存到一个文本文件中,可以在这里看到


任何帮助都将不胜感激:-)

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

声明

$sql = "SELECT * FROM products WHERE child_id = '$pid'";
告诉我,对于每个产品,您都在存储孩子的ID。通常,在基于树的结构中,情况正好相反,存储的是父ID而不是子ID,除非希望子节点具有多个父节点。如果是这种情况,那么函数很容易出现问题。考虑以下事项:

| ID | Child_ID |
+----+----------+
| 1  | 2        |
| 2  | 1        |
这将导致无限循环。如果您存储父对象id,那么根据这种性质,您将图形编码为层次结构。因为每个产品都有一个父产品,所以可以递归地编写逻辑

那么,可以这样写吗

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;
}

“挣扎”如何?怎么搞的?更具体一点,我看不到无限循环。当行用完时,while循环将结束。看到一个数据库有一个有限的行数…你可以看到我的方向。修复您的代码,使用您发布的代码中不存在的变量,并提供更多信息。@Ram他/她正在寻找的术语是递归。代码看起来不太正确,但您确定您有无限递归吗?无限递归将导致PHP崩溃,因此您可能会遇到另一个问题。检查这一点的一种方法是,每次进入函数体时都打印出
$pid
$found
数组你根本不用它。