php - 使用固定顺序的递归从 MySQL 数据库创建嵌套页面列表

标签 php mysql recursion

我正在尝试从存储在 MySQL 数据库中的数据创建一个嵌套的页面列表。 我尝试这样做是因为用户可以按照他们想要的方式对页面进行排序(使用 JS 脚本 nestedSortable),然后我可以从该数组中创建一个包含正确顺序的项目的菜单。

我的页面存储了以下数据:

page_id
parent_page_id
ordering
site_id
title

我从数据库中检索了以下内容:

SELECT * FROM `pages` WHERE site_id = '".$iSite_id."' ORDER BY parent_page_id, ordering ASC;

如果页面没有父页面,则 parent_page_id 为 0。

到目前为止一切顺利,但我在理解递归函数的工作原理时遇到了很多问题,并且由于级别的数量(理论上)是无限的,我无法解决创建此函数的问题。

这是我目前所拥有的:

$aPagesMenu = $oPage_controller->return_pages_menu($iSite_id);

function create_menu_recursive($aPagesMenu) {
    foreach($aPagesMenu as $aPage) {
        if($aPage['parent_page_id']){
             $aMenu[$aPage['parent_page_id']][$aPage['page_id']] = $aPage['title'];
            //Recursive function call here?
        } else {
            $aMenu[$aPage['page_id']] = $aPage['title'];
    }
    return $aMenu;
}

$aRecursiveMenu = create_menu_recursive($aPagesMenu);

我在尝试理解递归函数如何将其内容返回到第一级数组时卡住了? 我如何理解这一点并正确地将一层嵌套到另一层?

我真的很想了解这一点,因为它给我带来了很多延迟和问题。欢迎任何帮助!

编辑

从数据库中获取的一些数据:

array(6) {
  [0]=>
  array(4) {
    ["page_id"]=>
    string(3) "274"
    ["parent_page_id"]=>
    string(1) "0"
    ["menu_ordering"]=>
    string(1) "0"
    ["page_description"]=>
    NULL
  }
  [1]=>
  array(4) {
    ["page_id"]=>
    string(3) "278"
    ["parent_page_id"]=>
    string(1) "0"
    ["menu_ordering"]=>
    string(1) "1"
    ["page_description"]=>
    NULL
  }
  [2]=>
  array(4) {
    ["page_id"]=>
    string(3) "273"
    ["parent_page_id"]=>
    string(3) "274"
    ["menu_ordering"]=>
    string(1) "0"
    ["page_description"]=>
    NULL
  }
  [3]=>
  array(4) {
    ["page_id"]=>
    string(3) "275"
    ["parent_page_id"]=>
    string(3) "274"
    ["menu_ordering"]=>
    string(1) "1"
    ["page_description"]=>
    NULL
  }
  [4]=>
  array(4) {
    ["page_id"]=>
    string(3) "276"
    ["parent_page_id"]=>
    string(3) "275"
    ["menu_ordering"]=>
    string(1) "0"
    ["page_description"]=>
    NULL
  }
  [5]=>
  array(4) {
    ["page_id"]=>
    string(3) "277"
    ["parent_page_id"]=>
    string(3) "275"
    ["menu_ordering"]=>
    string(1) "1"
    ["page_description"]=>
    NULL
  }
}

此数据应转换为:

273
--> 275
--> 274
    --> 276
    --> 277
278
etc..

最佳答案

我搜索了 stackoverflow 上的旧帖子,我想我找到了我要找的东西:PHP Building Recursive Array from List

我使用了以下代码作为递归函数:

private function buildTree($itemList, $parentId) {
    // return an array of items with parent = $parentId
    $result = array();
    foreach ($itemList as $item) {
        if ($item['parent_page_id'] == $parentId) {
            $newItem = $item;
            $newItem['children'] = $this->buildTree($itemList, $newItem['page_id']);
            $result[] = $newItem;
        }
    }

    if (count($result) > 0) return $result;
    return null;
}

然后我用从数据库中得到的数组调用这个函数:

buildTree($aPages, 0);

它给了我数组 :D

关于php - 使用固定顺序的递归从 MySQL 数据库创建嵌套页面列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34720775/

相关文章:

php - 根据选择选项标签更改输入值

php - 使用 symfony2 中的 twig 表单验证表单是否为 null/未定义

.net - Mysql +将一列(table1)的数据复制到(table2)的列

php,mysql - 将结果组合成多维关联数组

python - 如何修复计数功能

php - 通过相关实体正确递归

c++ - 如何制作递归函数,它需要检查给定字符串中当前字母及其旁边的字母是小写还是大写?

php - Wordpress 静态页面 'SEO' ?

php - 在 prestashop 的 Hook.php 中具有函数 exec() 的目的是什么

mysql - 创建没有主键的 MySQL 表