我想知道为重复创建逻辑重复并在php上创建一个分支,结果将是这样的(这是没有重复逻辑的html):
<ul>
<li>
<a href="#">Parent</a>
<ul>
<li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
</li><li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Grand Grand Child</a>
</li><li>
<a href="#">Grand Grand Child</a>
</li>
</ul>
</li>
</ul>
</li><li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Grand Grand Child</a>
</li>
</ul>
</li><li>
<a href="#">Grand Child</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
这是通过使用递归函数和随后遍历的嵌套数组来完成的。以下功能可以在没有问题的情况下深入到n级。
<?php
function makeNav($item) {
$ret = '<li><a href="'.$item['url'].'">'.$item['name'].'</a>'.PHP_EOL;
if (isset($item['subPgs']) && is_array($item['subPgs']) && count($item['subPgs']) > 0) {
$ret .= '<ul>'.PHP_EOL;
foreach ($item['subPgs'] as $subPg) {
$ret .= makeNav($subPg);
}
$ret .= '</ul>'.PHP_EOL;
} else {
$ret .= '</li>'.PHP_EOL;
}
if (isset($item['subPgs']) && is_array($item['subPgs']) && count($item['subPgs']) > 0) {
$ret .= "</li>".PHP_EOL;
}
return $ret;
}
$navItems = array(
/*array(
'name' => 'Home',
'url' => '#',
'subPgs'=>array()
),*/
array(
'name' => 'Parent',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Child',
'url' => '#'
),
array(
'name' => 'Grand Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Child Child',
'url' => '#'
),
array(
'name' => 'Grand Child Child',
'url' => '#'
)
)
)
)
),
array(
'name' => 'Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Child',
'url' => '#',
'subPgs' => array(
array(
'name' => 'Grand Grand Child',
'url' => '#'
)
)
),
array(
'name' => 'Grand Child',
'url' => '#'
)
)
)
)
)
);
$nav = '<ul>';
foreach ($navItems as $navItem) {
$nav .= makeNav($navItem);
}
echo $nav.'</ul>';
?>
输出:(与OP匹配,格式除外)
<ul>
<li>
<a href="#">Parent</a>
<ul>
<li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
</li>
<li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Grand Child Child</a>
</li>
<li>
<a href="#">Grand Child Child</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#">Child</a>
<ul>
<li>
<a href="#">Grand Child</a>
<ul>
<li>
<a href="#">Grand Grand Child</a>
</li>
</ul>
</li>
<li>
<a href="#">Grand Child</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
请注意,如果您的数据集很大或者代码比每个列表元素中的简单文本字符串更复杂,您可能希望缓存递归函数的结果,并且只在数据更新时重建树。
如果我知道我可以通过其他功能访问每个父母的孩子,我会传递当前的父ID。当它起作用时,递归总是很棘手且看似简单。
// assuming getChildIds( $parentId ) is a function that returns an array of ids
// assuming getName( $id ) is a function that returns a name.
// If you actually want "Parent", "Child", ... "Grand Grand ... Grand Child"
// add a generation parameter to the recursive function and figure it out that way.
function echo_child_node( $parentId ) { ?>
<li>
<a href="#"><?php echo getName( $parentId ) ?></a>
<?php $childIds = getChildIds( $parentId ); ?>
<?php if ( $childIds ) : ?>
<ul>
<?php foreach( $childIds as $childId ) :
echo_child_node( $childId );
} ?>
</ul>
<?php endif; ?>
</li>
<? }