递归的php类别树扩展

时间:2015-09-16 17:55:32

标签: php mysql database recursion

我一直在搜索整个论坛,但找不到我的具体问题的答案。我希望你能帮助我,因为我花了很多时间把它想象成一个初学的PHP程序员。

我有一个监听此网址的网页:... / ... / edit_cat.php?id = 24

我想拥有一个不错的类别树。我已经完成了这个,但是我希望所有没有孩子的类别都是页面post.php的链接,所有父母都有子项作为链接,但只显示其他类别。您可以称之为某种下拉菜单。所以没有孩子是post.php,如果有孩子,那么其余的孩子就会失败。我希望这说清楚......这是我到目前为止的事情。它可以作为一棵树,但不是我希望它如何:

 <h2>This is the current category tree</h2>
 <?php
 category_tree(0);



 function category_tree($catid){
 include '../config/connect.php';

 $result = $db->prepare("SELECT * FROM categories WHERE parent_id = '".$catid."'");
 $result->execute();

 while($row = $result->fetch(PDO::FETCH_ASSOC)):
 $i = 0;
 if ($i == 0){ echo '<ul class="cattree">';}

 echo '<li><a href="category.php?id=' . $row['cat_id'] . '">' . $row['cat_title'] . '</a>';
  category_tree($row['cat_id']);
  echo '</li>';
 $i++;
 if ($i > 0){ echo '</ul>'; }

 endwhile;
}
?>

我的类别表如下:

 cat_id    |    cat_title    |    parent_id

    1          some_title              0
    2          some_title              1
    3          title!                  2
    4          main_title              0
    5          titellos!               4

2 个答案:

答案 0 :(得分:1)

这是我去年做过的事情,一个查询返回每一行,包含idx,parent_idx和该行的标签。

第一个电话:

print_list(1, 0, $lines);

功能:

function print_list($parent, $level, $ar) {

    $children = filter_by_parent($parent, $ar);
    if (empty($children)) {
        return;
    }

    echo '<ul>';

    foreach ($children as $child) {

        include PATH_PUBLIC . 'clients/simili/line.php';

        print_list($child['Child_Idx'], ($level + 1), $ar);

        echo  '</li>';

    }

    echo '</ul>';
}

第二功能:

function filter_by_parent($parent_id, $ar){
    $retval = array();
    foreach($ar as $a) {
        if ($a['Parent_Idx'] == $parent_id) {
            $retval[] = $a;
        }
    }
    return $retval;
}

在函数中调用了html:

<li class="no" data-id="<?php echo $child['Child_Idx']; ?>" data-parent-id="<?php echo $child['Parent_Idx']; ?>">
    <i class="fa fa-plus-square-o"></i>
    <i class="fa fa-minus-square-o"></i>
    &nbsp;
    <span class="name">
        <label><?php echo $child['Child_Name']; ?></label>
        <a href="<?php echo url(''); ?>clients/simili/detail.php?uo=<?php echo $child['Child_Idx']; ?>"><i class="fa fa-book" title="Détails de l'Unité d'Organisation"></a></i>
    </span>
    <div class="chiffres">
        <span class="inscrits"><?php echo $child['Nb_Collab']; ?></span>
        <span class="etp-collab"><?php echo $child['ETP_Collab']; ?></span>
        <span class="etp-postes"><?php echo $child['ETP_Postes']; ?></span>
        <span class="etp-unit"><?php echo $child['ETP_Unit']; ?></span>
    </div>    

答案 1 :(得分:0)

好的,我对PHP一无所知,但是这里是你可以在sql查询中添加“HasChildren”列的方法:

SELECT c.*, 
CASE
  WHEN EXISTS(SELECT * FROM Categories c1 WHERE c1.parent_id=c.cat_id) THEN 1
  ELSE 0
END AS HasChildren
FROM Categories c
WHERE ParentID = @CatID