星空2020 2023-10-24 13:21 采纳率: 64.1%
浏览 5
已结题

php pdo获取mysql菜单表,如何递归生成二级菜单json(mysql版本:5.7)

如下通过php pdo获取mysql菜单表,然后递归实现二级菜单。但是子菜单始终获取不到。


```php
<?php
header('content-type:application/json');
require './connect/pdo_connect_db.php';

function generateMenu($parentId = 0, $depth = 0) {
    global $pdo;
    $menu = array();
    $stmt = $pdo->prepare("SELECT * FROM sys_menu WHERE pid = :parentId");
    $stmt->bindParam(':parentId', $parentId, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if ($result) {
        foreach ($result as $row) {
            $item = array(
                'id' => $row['id'],
                'name' => $row['name'],
            );
            $menu[] = $item;
            $children = generateMenu($row['id'], $depth + 1);
            if ($children) {
                $item['children'] = $children;
            } elseif ($depth > 0) {
                // If a menu item has no children, and it's not the top-level menu, stop recursion.
                return $menu;
            }
        }
    }
    return $menu;
}
$menu = generateMenu(); 
$jsonMenu = json_encode($menu); 
echo $jsonMenu;
?>

当前获取到的只有父菜单:

```php
[
    {
        "id": "1",
        "name": "菜单1"
    },
    {
        "id": "2",
        "name": "菜单2"
    },
    {
        "id": "3",
        "name": "菜单3"
    },
    {
        "id": "4",
        "name": "菜单4"
    },
    {
        "id": "12",
        "name": "菜单5"
    },
    {
        "id": "13",
        "name": "菜单6"
    }
]


mysql sys_menu表:

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-24 16:14
    关注

    【以下回答由 GPT 生成】

    根据你提供的代码,递归调用generateMenu函数应该是正确的。但是,你遗漏了一个重要的步骤,即将子菜单添加到父菜单项中。

    在你的代码中,你将子菜单赋值给了一个临时变量$children,但忘记将它添加到父菜单项$item中。因此,菜单树中的子菜单不会被正确地展示。

    你可以通过将$item['children'] = $children;这一行代码移到$menu[] = $item;的前面来解决这个问题。这样,子菜单就会正确地添加到父菜单项中。

    以下是修改后的代码示例:

    <?php
    header('content-type:application/json');
    require './connect/pdo_connect_db.php';
    
    function generateMenu($parentId = 0, $depth = 0) {
        global $pdo;
        $menu = array();
        $stmt = $pdo->prepare("SELECT * FROM sys_menu WHERE pid = :parentId");
        $stmt->bindParam(':parentId', $parentId, PDO::PARAM_INT);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if ($result) {
            foreach ($result as $row) {
                $item = array(
                    'id' => $row['id'],
                    'name' => $row['name'],
                );
                $children = generateMenu($row['id'], $depth + 1);
                if ($children) {
                    $item['children'] = $children;
                } elseif ($depth > 0) {
                    // 如果一个菜单项没有子菜单,并且它不是顶级菜单,则停止递归。
                    return $menu;
                }
                $menu[] = $item; // 将子菜单添加到父菜单项中
            }
        }
        return $menu;
    }
    $menu = generateMenu(); 
    $jsonMenu = json_encode($menu); 
    echo $jsonMenu;
    ?>
    

    此外,确保数据库连接正常,连接文件pdo_connect_db.php被正确引入。

    这应该解决你遇到的问题。如果还有其他问题,请告诉我。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月25日
  • 已采纳回答 10月25日
  • 创建了问题 10月24日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题