我正在尝试从存储在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..
答案 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