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

标签 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
    )
)

我需要遍历这样一个数组,它可以有任意数量的导航,并智能地将它排序到它的父子关系中。我能够做到,但只有一层深。需要管理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/

相关文章:

javascript - Array sort() 在分配给另一个数组后对实际数组列表进行排序

javascript - 类型 'X' 的参数不可分配给类型 'Y' 的参数

arrays - 为什么 "array"在 Visual-C++ 中被标记为保留字?

java - do while 循环出现问题

ruby - 如何在 Ruby 中迭代修改数组子集?

php - (插入+重复键更新)+更新?

php - 如何使用数组 php 中的变量调用类?

php - 如何在 PHP 中打印元素数量未知的数组

javascript - 在javascript中抓取和显示xml格式的字符串

php - base_url() 函数在 codeigniter 中不起作用