更新时间:2023-01-17 19:20:28
通过递归函数解决方法:
例如: http://phpfiddle.org/main/$c$c/ PMW-7i3
< PHP功能array_process_for_ids($项目){
$ new_array =阵列();
的foreach($项目为$项目){
$ new_array [$项目['身份证'] = $项目;
}
返回$ new_array;
}功能菜单($项目){
功能menu_recursive($ parent_item){
全球$物品;
未设置($项目[$ parent_item ['身份证']);
呼应'< DIV的风格=填充左:均为15px;>';
回声 - $ parent_item ['名']。
的foreach($项目为$项目){
如果($项目['父'] == $ parent_item ['身份证']){
menu_recursive($项目);
}
}
呼应'< / DIV>';
}
的foreach($项目为$项目){
如果($项目['父'] == 0)menu_recursive($项目);
}
}$项目=阵列(
阵列(
'ID'=> 10,
父= GT; 0,
'名'=> 首页1',
'链接'=> top_page_1',
目标= GT; '_自'
)
阵列(
'ID'=> 12,
父= GT; 0,
'名'=> 首页2',
'链接'=> top_page_2',
目标= GT; '_自'
)
阵列(
'ID'=> 25,
父= GT; 10,
'名'=> 子页1首页1',
'链接'=> sub_page_1_of_top_page_1',
目标= GT; '_自'
)
阵列(
'ID'=> 26,
父= GT; 12,
'名'=> 子页1 2页面顶部,
'链接'=> sub_page_1_of_top_page_2',
目标= GT; '_自'
)
阵列(
'ID'=> 28,
父= GT; 26,
'名'=> 子页面1 2页面顶部的子页面',
'链接'=> sub_page_of_sub_page_1_of_top_page_2',
目标= GT; '_自'
)
);$项目= array_process_for_ids($项目);菜单($项目);?>
Anyone?
Thanks in advance, and let me know if you need any additional info.
I am attempting to turn a multi dimensional array to a multiple nested html navigation menu. I have the jist of it from another answer on SO: solution here.
What I am trying to figure out is how to preserve the top level parent link (and any subsequent child page links) in the url for the next child array. I tried passing in the link to the function when it calls itself to build the array, but that only preserved the most recent parent link.
Example:
Home
About
-Info
--Sub Page
becomes:
home about about/info about/info/subpage
Here is a sample array:
Array
(
[0] => stdClass Object
(
[id] => 12
[parent] => 11
[name] => Sub Page
[link] => sub_page
[target] => _self
)
[1] => stdClass Object
(
[id] => 14
[parent] => 12
[name] => Test
[link] => test_test
[target] => _self
)
[2] => stdClass Object
(
[id] => 9
[parent] => 0
[name] => Home
[link] => home
[target] => _self
)
[3] => stdClass Object
(
[id] => 11
[parent] => 10
[name] => Info
[link] => info
[target] => _self
)
[4] => stdClass Object
(
[id] => 13
[parent] => 10
[name] => Test
[link] => test
[target] => _self
)
[5] => stdClass Object
(
[id] => 10
[parent] => 0
[name] => About
[link] => about
[target] => _self
)
)
And here is the code I am using:
function create_menu_array($arr, $parent = 0){
$pages = array();
foreach($arr as $page){
if($page->parent == $parent){
$page->sub = isset($page->sub) ? $page->sub : $this->create_menu_array($arr, $page->id);
$pages[] = $page;
}
}
return $pages;
}
function create_menu_html($nav){
$html = '';
foreach($nav as $page){
$html .= '<ul><li>';
$html .= '<a href="' . base_url().$page->link . '" target="'.$page->target.'">' . $page->name . '</a>';
$html .= $this->create_menu_html($page->sub);
$html .= '</li></ul>';
}
return $html;
}
Solution with recursive function:
example: http://phpfiddle.org/main/code/pmw-7i3
<?php
function array_process_for_ids($items) {
$new_array = array();
foreach ($items as $item) {
$new_array[$item['id']] = $item;
}
return $new_array;
}
function menu($items) {
function menu_recursive($parent_item) {
global $items;
unset($items[$parent_item['id']]);
echo '<div style="padding-left: 15px;">';
echo '- '.$parent_item['name'];
foreach ($items as $item) {
if ($item['parent'] == $parent_item['id']) {
menu_recursive($item);
}
}
echo '</div>';
}
foreach ($items as $item) {
if ($item['parent'] == 0) menu_recursive($item);
}
}
$items = array(
array(
'id' => 10,
'parent' => 0,
'name' => 'Top Page 1',
'link' => 'top_page_1',
'target' => '_self'
),
array(
'id' => 12,
'parent' => 0,
'name' => 'Top Page 2',
'link' => 'top_page_2',
'target' => '_self'
),
array(
'id' => 25,
'parent' => 10,
'name' => 'Sub Page 1 of top page 1',
'link' => 'sub_page_1_of_top_page_1',
'target' => '_self'
),
array(
'id' => 26,
'parent' => 12,
'name' => 'Sub Page 1 of top page 2',
'link' => 'sub_page_1_of_top_page_2',
'target' => '_self'
),
array(
'id' => 28,
'parent' => 26,
'name' => 'Sub Page of sub page 1 of top page 2',
'link' => 'sub_page_of_sub_page_1_of_top_page_2',
'target' => '_self'
)
);
$items = array_process_for_ids($items);
menu($items);
?>