PHP:循环遍历多维数组并在数组项之间建立父子关系

Lau*_*nce 4 php arrays loops parent-child

我正在开发一个内容管理系统,我遇到了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
    )
)
Run Code Online (Sandbox Code Playgroud)

我需要遍历这样的数组,它可以有任意数量的导航并智能地将其排序到其父子关系中.我能够做到但只有一层深.它需要管理有孩子的孩子等有无限层数的孩子,并将其输出到HTML无序嵌套列表.

<ul>
  <li>
  <a>Nav</a>
     <ul>
        <li>
           <a>Subnav</a>
             <ul>
                 <li>
                    <a>Sub Sub nav</a>
                 </li>
             </ul>
        </li>
     </ul>
  <li>
<ul>
Run Code Online (Sandbox Code Playgroud)

等......

Saa*_*an. 12

我不认为你应该进入对象.另外我认为生成对象等只是额外的工作.在我看来,你应该遍历数组并生成一个代表导航层次结构的多维数组,然后递归循环生成的数组以生成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;
}
Run Code Online (Sandbox Code Playgroud)

**样品用量**

$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);
Run Code Online (Sandbox Code Playgroud)

您可以一步完成这两件事,但我认为首先生成多维数组更为简洁.祝好运!