从数组创建嵌套菜单
Create a nested menu from an array
我正在创建一个函数,它应该从数组中输出一个嵌套的 HTML 菜单。我想获得以下输出,但我得到 none:
期望输出
<ol class="sortable ui-sortable">
<li id="list_77"><div>test1</div>
<ol>
<li id="list_78"><div>subtest1</div>
<ol>
<li id="list_79"><div>subtest1-1</div></li>
</ol>
</li>
</ol>
</li>
</ol>
我的数据。
$item
Array
(
[77] => Array
(
[menu_id] => 77
[menu_name] => test1
[menu_parent_id] => 0
[menu_sort] => 1
[menu_link] =>
[menu_status] => 1
)
[78] => Array
(
[menu_id] => 78
[menu_name] => subtest1
[menu_parent_id] => 77
[menu_sort] => 1
[menu_link] =>
[menu_status] => 1
)
[79] => Array
(
[menu_id] => 79
[menu_name] => subtest1-1
[menu_parent_id] => 78
[menu_sort] => 1
[menu_link] =>
[menu_status] => 1
)
)
我的函数
function sub($list) {
foreach($list as $key => $menu){
echo '<li class="menu_list" id="item_'.$menu['menu_id'].'">';
echo '<div>'.$menu['menu_id'].'-'.$menu['menu_name'].'-'.$list[$menu['menu_id']]."==".$parent.'</div>';
if($list[$key]['menu_parent_id']!=$parent){
echo '<ol>';
echo $list[$key]['menu_parent_id'];
echo '</ol>';
} else {
sub($list);
}
echo "</li>";
}
}
$item = array();
echo sub($item);
你在递归方面遇到了一些问题。您应该将一些上下文传递给 sub
函数,即它应该为哪个菜单项生成子菜单。
这也意味着函数可能不需要 echo
任何东西,即当传递的菜单项没有任何子项时。
所以,一方面,这意味着您的所有 echo
都应该处于某种状态。
我还建议让函数创建 return 一个 HTML 字符串,然后您可以 echo
。这使得该功能使用起来更加灵活。
这是建议的代码:
function sub($list, $parent_id = null) {
$html = '';
foreach ($list as $menu_id => $menu) {
if ($list[$menu_id]['menu_parent_id'] == $parent_id) {
$sub = sub($list, $menu_id);
if ($sub != '') {
// if there are children, wrap them in OL tag:
$sub = "<ol>\n$sub</ol>\n";
}
// assemble HTML for this menu:
$html .= "<li class='menu_list' id='item_{$menu['menu_id']}'>"
. "<div>{$menu['menu_name']}</div>\n$sub</li>\n";
}
}
return $html;
}
使用方法如下:
// test data
$item = Array
(
77 => Array
(
"menu_id" => 77,
"menu_name" => 'test1',
"menu_parent_id" => 0,
"menu_sort" => 1,
"menu_link" => null,
"menu_status" => 1
),
78 => Array
(
"menu_id" => 78,
"menu_name" => 'subtest1',
"menu_parent_id" => 77,
"menu_sort" => 1,
"menu_link" => null,
"menu_status" => 1,
),
79 => Array
(
"menu_id" => 79,
"menu_name" => 'subtest1-1',
"menu_parent_id" => 78,
"menu_sort" => 1,
"menu_link" => null,
"menu_status" => 1
)
);
// Get complete output (no need to pass second argument)
echo sub($item);
输出如下:
<li class='menu_list' id='item_77'><div>test1</div>
<ol>
<li class='menu_list' id='item_78'><div>subtest1</div>
<ol>
<li class='menu_list' id='item_79'><div>subtest1-1</div>
</li>
</ol>
</li>
</ol>
</li>
我正在创建一个函数,它应该从数组中输出一个嵌套的 HTML 菜单。我想获得以下输出,但我得到 none:
期望输出
<ol class="sortable ui-sortable">
<li id="list_77"><div>test1</div>
<ol>
<li id="list_78"><div>subtest1</div>
<ol>
<li id="list_79"><div>subtest1-1</div></li>
</ol>
</li>
</ol>
</li>
</ol>
我的数据。
$item
Array
(
[77] => Array
(
[menu_id] => 77
[menu_name] => test1
[menu_parent_id] => 0
[menu_sort] => 1
[menu_link] =>
[menu_status] => 1
)
[78] => Array
(
[menu_id] => 78
[menu_name] => subtest1
[menu_parent_id] => 77
[menu_sort] => 1
[menu_link] =>
[menu_status] => 1
)
[79] => Array
(
[menu_id] => 79
[menu_name] => subtest1-1
[menu_parent_id] => 78
[menu_sort] => 1
[menu_link] =>
[menu_status] => 1
)
)
我的函数
function sub($list) {
foreach($list as $key => $menu){
echo '<li class="menu_list" id="item_'.$menu['menu_id'].'">';
echo '<div>'.$menu['menu_id'].'-'.$menu['menu_name'].'-'.$list[$menu['menu_id']]."==".$parent.'</div>';
if($list[$key]['menu_parent_id']!=$parent){
echo '<ol>';
echo $list[$key]['menu_parent_id'];
echo '</ol>';
} else {
sub($list);
}
echo "</li>";
}
}
$item = array();
echo sub($item);
你在递归方面遇到了一些问题。您应该将一些上下文传递给 sub
函数,即它应该为哪个菜单项生成子菜单。
这也意味着函数可能不需要 echo
任何东西,即当传递的菜单项没有任何子项时。
所以,一方面,这意味着您的所有 echo
都应该处于某种状态。
我还建议让函数创建 return 一个 HTML 字符串,然后您可以 echo
。这使得该功能使用起来更加灵活。
这是建议的代码:
function sub($list, $parent_id = null) {
$html = '';
foreach ($list as $menu_id => $menu) {
if ($list[$menu_id]['menu_parent_id'] == $parent_id) {
$sub = sub($list, $menu_id);
if ($sub != '') {
// if there are children, wrap them in OL tag:
$sub = "<ol>\n$sub</ol>\n";
}
// assemble HTML for this menu:
$html .= "<li class='menu_list' id='item_{$menu['menu_id']}'>"
. "<div>{$menu['menu_name']}</div>\n$sub</li>\n";
}
}
return $html;
}
使用方法如下:
// test data
$item = Array
(
77 => Array
(
"menu_id" => 77,
"menu_name" => 'test1',
"menu_parent_id" => 0,
"menu_sort" => 1,
"menu_link" => null,
"menu_status" => 1
),
78 => Array
(
"menu_id" => 78,
"menu_name" => 'subtest1',
"menu_parent_id" => 77,
"menu_sort" => 1,
"menu_link" => null,
"menu_status" => 1,
),
79 => Array
(
"menu_id" => 79,
"menu_name" => 'subtest1-1',
"menu_parent_id" => 78,
"menu_sort" => 1,
"menu_link" => null,
"menu_status" => 1
)
);
// Get complete output (no need to pass second argument)
echo sub($item);
输出如下:
<li class='menu_list' id='item_77'><div>test1</div>
<ol>
<li class='menu_list' id='item_78'><div>subtest1</div>
<ol>
<li class='menu_list' id='item_79'><div>subtest1-1</div>
</li>
</ol>
</li>
</ol>
</li>