益智教育网

php如何生成思维导图?代码实现方法有哪些?

方案概览

方案 技术原理 优点 缺点 适用场景
使用现成库 PHP 调用外部命令行工具(如 mmdot 功能强大、样式精美,支持多种布局和导出格式 需要服务器安装额外软件,配置稍复杂 需要生成高质量、复杂样式思维导图的后台系统
生成 JSON/HTML 前端库渲染(如 D3.js, Mind.js) 灵活、美观,用户体验好,交互性强 需要一定的前端知识,PHP 只负责提供数据 Web 应用,需要用户交互和动态更新的前端界面
纯 PHP 生成 HTML/CSS 用 PHP 代码直接构建 HTML 结构和 CSS 样式 无需任何外部依赖,轻量级,部署简单 样式固定,交互性差,难以实现复杂布局 简单的、非交互式的展示,或快速原型开发

使用现成库 (推荐 - 功能强大)

这个方案的核心思想是 PHP 作为“指挥官”,它负责生成思维导图的文本描述文件,然后调用一个强大的命令行工具来渲染成图片或可交互的 HTML。

php如何生成思维导图?代码实现方法有哪些?-图1

这里我们以 Markdeep 为例,它非常轻量且易于使用,另一个更强大的选择是 Graphvizdot 工具,可以生成更复杂的树状图。

步骤 1: 安装命令行工具

在服务器上安装 mm 工具,对于 Debian/Ubuntu 系统,非常简单:

sudo apt-get update
sudo apt-get install mm

安装后,在命令行输入 mm -V 检查是否安装成功。

步骤 2: PHP 代码实现

PHP 的任务是:

  1. 定义思维导图的层级结构数据。
  2. 将数据转换成 mm 工具能识别的文本格式(.mm 文件)。
  3. 调用 mm 命令,将 .mm 文件渲染成 .png 图片。
  4. (可选)清理临时文件。

generate_mindmap.php

<?php
/**
 * 使用 mm 命令行工具生成思维导图
 */
// 1. 定义思维导图的数据结构 (树形数组)
$mindmapData = [
    'root' => '我的项目',
    'children' => [
        [
            'node' => '前端',
            'children' => [
                ['node' => 'HTML'],
                ['node' => 'CSS'],
                ['node' => 'JavaScript'],
            ],
        ],
        [
            'node' => '后端',
            'children' => [
                ['node' => 'PHP'],
                ['node' => 'MySQL'],
                [
                    'node' => '框架',
                    'children' => [
                        ['node' => 'Laravel'],
                        ['node' => 'Symfony'],
                    ],
                ],
            ],
        ],
        [
            'node' => '部署',
            'children' => [
                ['node' => 'Nginx'],
                ['node' => 'Docker'],
            ],
        ],
    ],
];
// 2. 将数组转换为 mm 格式的字符串
function convertToMmFormat($data, $indent = 0) {
    $mmString = str_repeat('  ', $indent) . $data['node'] . "\n";
    if (isset($data['children'])) {
        foreach ($data['children'] as $child) {
            $mmString .= convertToMmFormat($child, $indent + 1);
        }
    }
    return $mmString;
}
$mmContent = convertToMmFormat($mindmapData);
// 3. 定义文件路径
$mmFilePath = 'project_map.mm';
$imageOutputPath = 'project_map.png';
// 4. 将 mm 内容写入临时文件
file_put_contents($mmFilePath, $mmContent);
// 5. 执行 mm 命令生成图片
// -i: 输入文件
// -o: 输出文件
// -p: 使用 'pixmap' 驱动生成图片
$command = "mm -i {$mmFilePath} -o {$imageOutputPath} -p";
// 执行命令并检查是否成功
exec($command, $output, $returnVar);
if ($returnVar === 0) {
    echo "思维导图生成成功!图片路径: <a href='{$imageOutputPath}'>{$imageOutputPath}</a>";
} else {
    echo "生成失败!错误码: " . $returnVar . "<br>";
    echo "命令输出: " . implode('<br>', $output);
}
// 6. (可选) 清理临时文件
// unlink($mmFilePath);
?>

如何运行:

  1. 将以上代码保存为 generate_mindmap.php
  2. 确保服务器已安装 mm 工具。
  3. 通过浏览器访问该 PHP 文件,或通过命令行 php generate_mindmap.php 运行。
  4. 运行成功后,会在同一目录下生成 project_map.png 图片。

生成 JSON,由前端库渲染 (推荐 - 灵活交互)

这是目前 Web 应用中最主流的方案,PHP 的职责非常纯粹:提供数据,页面的展示、交互和美化完全交给强大的前端 JavaScript 库。

这里我们使用 d3.js,它是一个基于数据驱动文档的库,非常适合用来构建复杂的可视化图表。

步骤 1: 准备 HTML 和前端库

创建一个 index.html 文件,引入 d3.js 库。

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">PHP + D3.js 思维导图</title>
    <style>
        /* 一些基本的样式 */
        #mindmap {
            width: 100%;
            height: 100vh;
            overflow: hidden;
            font-family: sans-serif;
        }
        .node circle {
            fill: #fff;
            stroke: steelblue;
            stroke-width: 3px;
        }
        .node text {
            font: 12px sans-serif;
        }
        .link {
            fill: none;
            stroke: #ccc;
            stroke-width: 2px;
        }
    </style>
    <!-- 引入 D3.js -->
    <script src="https://d3js.org/d3.v7.min.js"></script>
</head>
<body>
    <h1>我的项目思维导图</h1>
    <div id="mindmap"></div>
    <script>
        // 2. PHP 提供的数据将通过 AJAX 获取到这里
        // 我们先用一个占位符
        let treeData = {}; 
        // 使用 fetch API 从 PHP 获取 JSON 数据
        fetch('get_mindmap_data.php')
            .then(response => response.json())
            .then(data => {
                treeData = data;
                renderMindmap(treeData);
            })
            .catch(error => console.error('Error fetching data:', error));
        // 3. 渲染函数
        function renderMindmap(data) {
            // 选择容器并设置尺寸
            const width = document.getElementById('mindmap').clientWidth;
            const height = document.getElementById('mindmap').clientHeight;
            const svg = d3.select("#mindmap").append("svg")
                .attr("width", width)
                .attr("height", height);
            // 创建一个树布局
            const treeLayout = d3.tree().size([height, width - 160]);
            // 生成层次结构
            const root = d3.hierarchy(data);
            treeLayout(root);
            // 绘制连接线
            svg.selectAll(".link")
                .data(root.links())
                .enter().append("path")
                .attr("class", "link")
                .attr("d", d3.linkHorizontal()
                    .x(d => d.y + 80)
                    .y(d => d.x));
            // 绘制节点
            const node = svg.selectAll(".node")
                .data(root.descendants())
                .enter().append("g")
                .attr("class", "node")
                .attr("transform", d => `translate(${d.y + 80},${d.x})`);
            node.append("circle")
                .attr("r", 10);
            node.append("text")
                .attr("dy", ".35em")
                .attr("x", d => d.children ? -13 : 13)
                .style("text-anchor", d => d.children ? "end" : "start")
                .text(d => d.data.name);
        }
    </script>
</body>
</html>

步骤 2: PHP 提供数据

PHP 文件的任务非常简单:输出一个符合前端库要求的 JSON 格式数据。

get_mindmap_data.php

<?php
// 1. 定义思维导图的数据结构 (和方案一类似)
$mindmapData = [
    'name' => '我的项目', // d3.js 通常使用 'name' 作为节点名称
    'children' => [
        [
            'name' => '前端',
            'children' => [
                ['name' => 'HTML'],
                ['name' => 'CSS'],
                ['name' => 'JavaScript'],
            ],
        ],
        [
            'name' => '后端',
            'children' => [
                ['name' => 'PHP'],
                ['name' => 'MySQL'],
                [
            'name' => '框架',
            'children' => [
                ['name' => 'Laravel'],
                ['name' => 'Symfony'],
            ],
        ],
    ],
    ],
];
// 2. 设置正确的响应头
header('Content-Type: application/json; charset=utf-8');
// 3. 输出 JSON 数据
echo json_encode($mindmapData, JSON_UNESCAPED_UNICODE);
?>

如何运行:

  1. index.htmlget_mindmap_data.php 放在同一个目录下。
  2. 通过浏览器访问 index.html
  3. 页面会自动加载 PHP 提供的 JSON 数据,并用 D3.js 将其渲染成一个可交互、可缩放、可拖拽的思维导图。

纯 PHP 生成 HTML/CSS (简单轻量)

如果你的需求非常简单,只需要一个静态的、不可交互的树状图来展示数据,那么可以直接用 PHP 生成 HTML 和 CSS。

PHP 代码实现

generate_simple_html.php

<?php
// 1. 定义思维导图的数据结构
$mindmapData = [
    'root' => '我的项目',
    'children' => [
        [
            'node' => '前端',
            'children' => [
                ['node' => 'HTML'],
                ['node' => 'CSS'],
                ['node' => 'JavaScript'],
            ],
        ],
        [
            'node' => '后端',
            'children' => [
                ['node' => 'PHP'],
                ['node' => 'MySQL'],
                [
                    'node' => '框架',
                    'children' => [
                        ['node' => 'Laravel'],
                        ['node' => 'Symfony'],
                    ],
                ],
            ],
        ],
    ],
];
// 2. 递归生成 HTML
function generateHtmlList($data) {
    $html = '<ul>';
    $html .= '<li>' . htmlspecialchars($data['root']);
    if (isset($data['children']) && !empty($data['children'])) {
        $html .= '<ul>';
        foreach ($data['children'] as $child) {
            $html .= '<li>' . htmlspecialchars($child['node']);
            if (isset($child['children']) && !empty($child['children'])) {
                $html .= generateHtmlList($child);
            }
            $html .= '</li>';
        }
        $html .= '</ul>';
    }
    $html .= '</li>';
    $html .= '</ul>';
    return $html;
}
$htmlOutput = generateHtmlList($mindmapData);
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">纯 PHP HTML 思维导图</title>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        ul, li { list-style-type: none; padding-left: 20px; margin: 0; }
        /* 连接线样式 */
        ul ul::before {
            content: '';
            border-left: 1px solid #ccc;
            position: absolute;
            left: 0;
            top: 0;
            bottom: 0;
            width: 1px;
        }
        li {
            position: relative;
            padding-left: 25px;
        }
        li::before {
            content: '';
            border-top: 1px solid #ccc;
            position: absolute;
            left: 0;
            top: 50%;
            width: 20px;
        }
        /* 根节点特殊样式 */
        ul { position: relative; }
        ul::before { display: none; }
    </style>
</head>
<body>
    <h1>我的项目思维导图 (静态)</h1>
    <?php
    // 3. 输出生成的 HTML
    echo $htmlOutput;
    ?>
</body>
</html>

如何运行: 直接通过浏览器访问这个 PHP 文件,它会直接输出一个带有内联 CSS 的完整 HTML 页面,显示一个静态的树状结构。

总结与建议

  • 追求功能强大、样式精美,且不介意安装服务器软件:选择 方案一mmGraphviz 能生成非常专业的图形。
  • 开发 Web 应用,需要用户交互、动态更新和现代化外观:强烈推荐 方案二,这是目前最灵活、用户体验最好的方案,前后端职责分离,易于维护和扩展。
  • 只需要一个非常简单的、静态的、无交互的树状图:选择 方案三,它最简单,没有外部依赖,适合快速实现或作为后台管理系统中的一个简单展示模块。
分享:
扫描分享到社交APP
上一篇
下一篇