2011-09-07 66 views
2

我创建了一个递归函数来获取产品的父级产品。我几乎可以确定我已经快到了,但需要帮助完成递归。如何使用递归来检索父节点?

我正在寻找的结果是这样的:

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

看到任何帮助,将严重赞赏:-)

+0

“挣扎”怎么样?发生了什么?更加详细一些。 –

+2

我没有看到无限循环。 while循环会在行用完时结束。看到一个数据库有有限的行数......你可以看到我要去哪里。修复您的代码,使用您的发布代码中不存在的变量,并提供更多信息。 –

+0

@Ram他/她正在寻找的术语是递归。 – NullUserException

回答

2
的结果

嗯..你你的数据库的结构来看,似乎有什么不妥,除非我失去了一些东西

声明

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

告诉我,对于每种产品,您都在存储孩子的ID。通常情况下,在基于树的结构中,情况恰恰相反,除了要让子节点拥有多个父节点外,您还需要存储父节点ID而不是子节点。如果是这种情况,那么该功能很容易出现问题。考虑以下几点:

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

这将导致无限循环。如果你存储parent_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; 
}