PHP递归函数来获取痕迹

时间:2010-10-29 06:39:53

标签: php parent-child recursive-query

花了几个小时,需要一些专家帮助。

我有一张这样的表:

[id] [name] [parent_id]
1    fruits  0
2    orange  1
3    lemon   2
4    steak   0

当我去柠檬时,我希望面包屑像:

主页>水果>橙色>柠檬

柠檬不是链接,而是其余的链接。

有什么建议吗?

我找到的最好的是这个,但它将一切都变成了一个链接。

    function createPath($id, $category_tbl) {

        $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
        $r = mysql_query($s);
        $row = mysql_fetch_array($r);

        if($row['parent_id'] == 0) {
            $name = $row['name'];
            return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > ";
        } else {
            $name = $row['name'];
            return createPath($row['parent_id'],$category_tbl). " <a href='index.php?folder_id=$id'>".$name."</a> >";
        }
    }

以下Erwin的回答给了我使其成功的所需。

function createPath($id, $category_tbl, $except = null) {
    $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
    $r = mysql_query($s);
    $row = mysql_fetch_array($r);
    if($row['parent_id'] == 0) {
        $name = $row['name'];
        if(!empty($except) && $except == $row['id']) {
            return "<a href='index.php'>Admin</a> &raquo; ".$name."";
        }
        return "<a href='index.php'>Admin</a> &raquo; <a href='index.php?folder_id=$id'>".$name."</a> &raquo; ";
    } else {
        if(!empty($except) && $except == $row['id']) {
            $name = $row['name'];
            return createPath($row['parent_id'],$category_tbl, false). " $name";
        } 
        $name = $row['name'];
        return createPath($row['parent_id'],$category_tbl, false). " <a href='index.php?folder_id=$id'>".$name."</a> &raquo;";
    }
}

3 个答案:

答案 0 :(得分:3)

添加第三个参数,该参数将是不应呈现为标记的链接名称

function createPath($id, $category_tbl, $except = null) {

    $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id";
    $r = mysql_query($s);
    $row = mysql_fetch_array($r);

    if($row['parent_id'] == 0) {
        $name = $row['name'];  
        return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > ";
    } else {
        $name = $row['name'];
        if(!empty($except) && $except == $name)
            return createPath($row['parent_id'],$category_tbl, $except)." ".$name;
        }
        return createPath($row['parent_id'],$category_tbl, $except). " <a href='index.php?folder_id=$id'>".$name."</a> >";
    }
}

答案 1 :(得分:1)

该代码不会向后反映结果Lemon > Orange > Fruits > Home吗?正如joni建议的那样,我将结果放在一个数组中,然后构建输出字符串。

如果您在数据库中有其他所需信息,例如folder_id=$id以外的网址,则可以将其存储为

$breadcrumb_items = array(
      0 => array( 'id' => '3', 
                  'title' => 'Lemon', 
                  'url' => 'LemonURL'
                ),
      1 => array( 'id' => '2', 
                  'title' => 'Orange', 
                  'url' => 'OrangeURL'
                ),
      2 => array( 'id' => '1', 
                  'title' => 'Fruit', 
                  'url' => 'FruitURL'
                ),
      3 => array( 'id' => '0', 
                  'title' => 'Home', 
                  'url' => 'HomeURL'
                )
);

然后调用array_reverse来修复数组顺序,然后构建你的html。确保设置一个标志以防止最后一项成为链接。

$targetID = 3; //Lemon
foreach( $breadcrumb_items as $breadcrumb ){
...
   if( $breadcrumb['id'] != $targetID ){ //if the id does not match our target id
      //add link code
   }
...
}

答案 2 :(得分:0)

不是及时输出,而是创建一个数组并在那里缓冲结果。在数组被createPath()填充之后,您可以通过for循环输出面包屑,该循环知道最后一个元素是哪个(通过count())并且可以避免从中生成链接。