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

这里我们以 Markdeep 为例,它非常轻量且易于使用,另一个更强大的选择是 Graphviz 的 dot 工具,可以生成更复杂的树状图。
步骤 1: 安装命令行工具
在服务器上安装 mm 工具,对于 Debian/Ubuntu 系统,非常简单:
sudo apt-get update sudo apt-get install mm
安装后,在命令行输入 mm -V 检查是否安装成功。
步骤 2: PHP 代码实现
PHP 的任务是:
- 定义思维导图的层级结构数据。
- 将数据转换成
mm工具能识别的文本格式(.mm文件)。 - 调用
mm命令,将.mm文件渲染成.png图片。 - (可选)清理临时文件。
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);
?>
如何运行:
- 将以上代码保存为
generate_mindmap.php。 - 确保服务器已安装
mm工具。 - 通过浏览器访问该 PHP 文件,或通过命令行
php generate_mindmap.php运行。 - 运行成功后,会在同一目录下生成
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);
?>
如何运行:
- 将
index.html和get_mindmap_data.php放在同一个目录下。 - 通过浏览器访问
index.html。 - 页面会自动加载 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 页面,显示一个静态的树状结构。
总结与建议
- 追求功能强大、样式精美,且不介意安装服务器软件:选择 方案一。
mm或Graphviz能生成非常专业的图形。 - 开发 Web 应用,需要用户交互、动态更新和现代化外观:强烈推荐 方案二,这是目前最灵活、用户体验最好的方案,前后端职责分离,易于维护和扩展。
- 只需要一个非常简单的、静态的、无交互的树状图:选择 方案三,它最简单,没有外部依赖,适合快速实现或作为后台管理系统中的一个简单展示模块。
