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


Create nested pages-list from MySQL database using recursion with fixed ordering

我正试图从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从列表构建递归数组

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

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