我正在开发一个内容管理系统,但我遇到了 CMS 中项目的父子关系问题。
基本上我有一个可以创建页面的系统,创建页面时您可以选择父页面进行子导航。在我尝试从数据库生成导航之前,一切都很好。
我不确定某种联接是否会更好,但我更喜欢将所有数据放入一个数组中并使用 php 操作该数组。
我从数据库中得到的结果数组是这样的:
Array
(
[0] => Array
(
[id] => 27
[name] => home
[link] => home.html
[parent] => 0
)
[1] => Array
(
[id] => 30
[name] => about
[link] => about.html
[parent] => 27
)
)
我需要遍历这样一个数组,它可以有任意数量的导航,并智能地将它排序到它的父子关系中。我能够做到,但只有一层深。需要管理children with children with children等无限层数输出成HTML无序列表。
<ul>
<li>
<a>Nav</a>
<ul>
<li>
<a>Subnav</a>
<ul>
<li>
<a>Sub Sub nav</a>
</li>
</ul>
</li>
</ul>
<li>
<ul>
等等。 ...
最佳答案
我认为你不应该进入对象。另外,我认为生成对象等只是额外的工作。在我看来,您应该遍历数组并生成一个表示导航层次结构的多维数组,然后递归地循环生成的数组以生成您的 HTML。我已经为您完成了示例代码,它可以按照您希望的方式工作,但您可能想要进行一些更改。
函数
// Generate your multidimensional array from the linear array
function GenerateNavArray($arr, $parent = 0)
{
$pages = Array();
foreach($arr as $page)
{
if($page['parent'] == $parent)
{
$page['sub'] = isset($page['sub']) ? $page['sub'] : GenerateNavArray($arr, $page['id']);
$pages[] = $page;
}
}
return $pages;
}
// loop the multidimensional array recursively to generate the HTML
function GenerateNavHTML($nav)
{
$html = '';
foreach($nav as $page)
{
$html .= '<ul><li>';
$html .= '<a href="' . $page['link'] . '">' . $page['name'] . '</a>';
$html .= GenerateNavHTML($page['sub']);
$html .= '</li></ul>';
}
return $html;
}
** 示例用法 **
$nav = Array
(
Array
(
'id' => 27,
'name' => 'home',
'link' => 'home.html',
'parent' => 0
),
Array
(
'id' => 30,
'name' => 'about',
'link' => 'about.html',
'parent' => 27
)
);
$navarray = GenerateNavArray($nav);
echo GenerateNavHTML($navarray);
您可能可以一步完成这两件事,但我认为先生成多维数组会更整洁。祝你好运!
关于PHP:遍历多维数组并建立数组项之间的父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685825/