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

时间:2011-09-07 12:48:43

标签: 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: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);

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

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

任何帮助都会受到重视: - )

1 个答案:

答案 0 :(得分:2)

嗯..根据你的数据库结构判断,除非我遗漏了某些东西,否则看起来有点不对劲

声明

$sql = "SELECT * FROM products WHERE child_id = '$pid'";

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

| ID | Child_ID |
+----+----------+
| 1  | 2        |
| 2  | 1        |

这会导致无限循环。如果存储parent_id,那么就这种性质而言,您将图形编码为分层。由于每个产品都有A父级,因此逻辑可以递归写入。

那么可以这样写吗?

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