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

时间:2016-01-11 11:46:16

标签: 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..

1 个答案:

答案 0 :(得分:0)

我搜索了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