如何使用递归插入数据?

时间:2012-10-28 04:33:45

标签: php

我正在使用一种通过递归为我的网站构建导航的方法,但是我在添加样式时遇到了麻烦。构建我的方法的方法我似乎无法找到一种方法来使父类成为父类,而子类成为子类,所以在CSS中我可以设置两者的样式。如果它会让事情更容易理解,这是我的数据库的一个例子:

enter image description here

以下是我想要实现的输出示例:

<ul>
    <li class="parent">Parent
    <ul>
        <li class="child">Child 1</li>
        <li class="child">Child 2</li>
        <li class="child">Child 3</li>
        <li class="child">Child 4</li>
    </ul>
    </li>
</ul>

当前代码将child放在<li>的每个实例中。我尝试了很多不同的东西,这让我很伤心。这是代码:

/* i'm using pdo to pull all the categories out of MySQL, NULL means it will be a parent category */
$array = $categoryVIEW->fetchAll(PDO::FETCH_ASSOC);
$this->buildSide($array,NULL)

private function buildSide($items,$parent)
{
    $hasChildren = false;
    $outputHtml = '<ul>%s</ul>';
    $childrenHtml = ''; 
    foreach($items as $item)
    {
        if ($item['parent'] == $parent)
        {
            $hasChildren = true;
            $childrenHtml .= '<li><a href="?c='.$item['category_id'].'">'.$item['category_name'];         
            $childrenHtml .= $this->buildSide($items,$item['category_id']);         
            $childrenHtml .= '</a></li>';           
        }
    }
    if (!$hasChildren)
    {
        $outputHtml = '';
    }
    return sprintf($outputHtml,$childrenHtml);      
}

我确信这很容易,但我被困住了:(

感谢您一看!

更新

我一直在玩我的代码,并添加了一个条件来检查$parentNULL,如果是,请$class为父,否则请$class儿童。我遇到的问题是我在每个孩子之后得到一个不受欢迎的<ul></ul>?奇怪的是,当我更改$child = false;时,它会消除我的错误<ul></ul>,但会使所有内容变为父级。

private function buildSide($array,$parent)
{       
    $child = ($parent === NULL)?false:true;
    $html  = '';
    $tag   = '<ul>%s</ul>'; 
    $class = ($child)?'child':'parent'; 

    foreach($array as $item)
    {
        if($item['parent'] === $parent)
        {
            $child = true;
            $html .= '<li class="'.$class.'">'.$item['category_name'];
            $html .= $this->buildSide($array,$item['category_id']);
            $html .= "</li>\n";
        }
    }
    if(!$child)
    {
        $tag = '';
    }
    return sprintf($tag,$html);
}

1 个答案:

答案 0 :(得分:0)

根据您的修改

更新

如果我理解你想要实现的目标,你可能需要在两次传递中执行此操作...由于数据库中的parent字段从平面树创建隐式层次结构,您可能需要先构造层次结构以获得所需的输出。由于您在处理数据元素时呈现HTML,因此在呈现列表时无法保证层次结构的保留。

相反,您需要生成一个与您存储在数据库中的父/子关系相匹配的层次结构。这里有几个主题可以解决这个过程(for example)。一旦你有一个与你的隐式数据库结构相匹配的树结构,生成匹配的HTML应该相当简单。