我正在使用一种通过递归为我的网站构建导航的方法,但是我在添加样式时遇到了麻烦。构建我的方法的方法我似乎无法找到一种方法来使父类成为父类,而子类成为子类,所以在CSS中我可以设置两者的样式。如果它会让事情更容易理解,这是我的数据库的一个例子:
以下是我想要实现的输出示例:
<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);
}
我确信这很容易,但我被困住了:(
感谢您一看!
更新
我一直在玩我的代码,并添加了一个条件来检查$parent
是NULL
,如果是,请$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);
}
答案 0 :(得分:0)
更新
如果我理解你想要实现的目标,你可能需要在两次传递中执行此操作...由于数据库中的parent
字段从平面树创建隐式层次结构,您可能需要先构造层次结构以获得所需的输出。由于您在处理数据元素时呈现HTML,因此在呈现列表时无法保证层次结构的保留。
相反,您需要生成一个与您存储在数据库中的父/子关系相匹配的层次结构。这里有几个主题可以解决这个过程(for example)。一旦你有一个与你的隐式数据库结构相匹配的树结构,生成匹配的HTML应该相当简单。