php 菜单 实现
PHP 菜单实现方法
动态菜单生成
使用数组或数据库存储菜单项,通过循环动态生成HTML。示例代码:
$menuItems = [
['title' => '首页', 'url' => 'index.php'],
['title' => '产品', 'url' => 'products.php'],
['title' => '关于', 'url' => 'about.php']
];
echo '<ul>';
foreach ($menuItems as $item) {
echo '<li><a href="'.$item['url'].'">'.$item['title'].'</a></li>';
}
echo '</ul>';
数据库驱动菜单
从数据库读取菜单结构,适合内容管理系统:
$db = new PDO('mysql:host=localhost;dbname=site', 'user', 'pass');
$stmt = $db->query("SELECT * FROM menu_items ORDER BY sort_order");
$menuItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($menuItems as $item) {
// 生成菜单代码
}
多级菜单实现
使用递归函数处理多级菜单结构:
function buildMenu(array $items, $parentId = 0) {
$html = '<ul>';
foreach ($items as $item) {
if ($item['parent_id'] == $parentId) {
$html .= '<li>';
$html .= '<a href="'.$item['url'].'">'.$item['title'].'</a>';
$html .= buildMenu($items, $item['id']);
$html .= '</li>';
}
}
$html .= '</ul>';
return $html;
}
当前页面高亮
通过比较URL实现当前菜单项高亮:
$currentPage = basename($_SERVER['PHP_SELF']);
foreach ($menuItems as $item) {
$class = (basename($item['url']) == $currentPage) ? 'active' : '';
echo '<li class="'.$class.'"><a href="'.$item['url'].'">'.$item['title'].'</a></li>';
}
响应式菜单
结合CSS和JavaScript实现移动端友好菜单:
<nav class="navbar">
<div class="menu-icon" onclick="toggleMenu()">☰</div>
<ul class="menu" id="mainMenu">
<!-- PHP生成的菜单项 -->
</ul>
</nav>
<style>
.navbar { display: flex; }
.menu-icon { display: none; }
@media (max-width: 768px) {
.menu-icon { display: block; }
.menu { display: none; }
.menu.active { display: block; }
}
</style>
<script>
function toggleMenu() {
document.getElementById('mainMenu').classList.toggle('active');
}
</script>
权限控制菜单
根据用户角色显示不同菜单项:
$userRole = $_SESSION['user_role'] ?? 'guest';
foreach ($menuItems as $item) {
if (in_array($userRole, $item['allowed_roles'])) {
echo '<li><a href="'.$item['url'].'">'.$item['title'].'</a></li>';
}
}
缓存优化
对不常变化的菜单使用缓存:

$cacheFile = 'menu_cache.txt';
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) {
echo file_get_contents($cacheFile);
} else {
ob_start();
// 生成菜单代码
$menuHtml = ob_get_clean();
file_put_contents($cacheFile, $menuHtml);
echo $menuHtml;
}






