我正在尝试在 php 中制作多级菜单,但无法正确输出 html。
首先,我从 db 中提取数据,在 'sort_id' 和 'id' 之后对其进行排序,并将其存储到一个数组中。
数据库结构:
id | parent_id | sort_id | title
---------------------------------
1 | 0 | 0 | test1
2 | 1 | 1 | test2
3 | 1 | 0 | test3
4 | 0 | 1 | test4
5 | 2 | 0 | test5
PHP 代码
function hasChildren( $id, $data ) {
foreach ($data as $d ) {
if ( $d['parent_id'] == $id ) {
return true;
break;
}
}
}
function menu ($arr) {
foreach ( $arr as $d ) {
if( is_array($d) && $d['parent_id'] == 0 ) {
echo "<li><a href={$d['link']}>{$d['title']}</a>";
if ( hasChildren ($d['id'], $arr) ) echo "<ul>";
}
foreach ( $arr as $row ) {
if ( is_array($row) ) {
if( $row['parent_id'] == $d['id'] ) {
if ( hasChildren ($row['id'], $arr) ) {
echo "<li><a href={$row['link']}>{$row['title']}</a><ul>";
} else echo "<li><a href={$row['link']}>{$row['title']}</a>";
menu($row);
if ( hasChildren ($row['id'], $arr) ) {
echo "</ul></li>";
} else echo "</li>";
}
}
}
if ( is_array($d) && $d['parent_id'] == '0' ) {
if ( hasChildren ($d['id'], $arr) ) echo "</ul>";
echo "</li>";
}
}
}
HTML 输出
<li>
<a href="http://localhost">test1</a>
<ul>
<li><a href="http://localhost/2">test3</a></li>
<li><a href="http://localhost/1">test2</a>
<ul></ul>
</li>
</ul>
</li>
<li><a href="http://localhost/5">test5</a></li>
<li><a href="http://localhost/4">test4</a></li>
在“test2”打开和关闭一个“ul”标签之后
“test5”应该是“test2”的孩子而不是父母
我知道这可能不是最好的方法,但任何人都可以告诉我我做错了什么?