PHP不绘图,仅负责生成符合前端堆叠要求的数据:需统一横轴标签、按键对齐、缺值补0、确保数值类型、输出标准对象数组结构,并由前端配置启用堆叠模式。

PHP 本身不绘图,但可以用它生成图表所需的数据结构或调用绘图库(如 Chart.js、ECharts)的后端数据接口;堆叠柱形图的关键不在 PHP 合并逻辑,而在数据格式是否符合前端图表库的“堆叠”要求。
PHP 合并多组数据前先理清维度对齐规则
堆叠柱形图要求每组数据必须有完全一致的横轴(X 轴)标签(比如月份、产品名),且每个标签下各数据系列(如“线上销量”“线下销量”)的值一一对应。常见错误是直接 array_merge 多个数组导致键错位或缺失。
- 用统一的键名(如
'month'或'category')作为主索引,所有数据组都按该键对齐 - 推荐用
foreach遍历基准键数组,再从各数据源中提取对应值,缺值补0(不能留空或null,否则堆叠会断裂) - 避免用
array_values()强制重排——它会丢掉原始键关联,让“1月”和“2月”在不同数组里错位
用关联数组结构组织堆叠数据(Chart.js/ECharts 兼容格式)
前端图表库通常要求堆叠数据为「多个同长度数组」或「对象数组」。PHP 应输出类似这样的结构(供 AJAX 返回 JSON):
[
{ "x": "Jan", "线上": 120, "线下": 80 },
{ "x": "Feb", "线上": 150, "线下": 95 }
]
实现时建议:
立即学习“PHP免费学习笔记(深入)”;
- 先定义横轴标签数组:
$labels = ['Jan', 'Feb', 'Mar'] - 用
array_map构建每行对象:array_map(fn($l) => ['x' => $l, '线上' => $online[$l] ?? 0, '线下' => $offline[$l] ?? 0], $labels) - 若数据来自数据库,优先用 SQL 的
GROUP BY+CASE WHEN汇总,比 PHP 合并更可靠(尤其数据量大时)
注意 JSON 编码时的数值类型陷阱
前端堆叠图依赖数值做累加计算,如果 PHP 输出字符串数字(如 "120"),某些库(如早期 Chart.js)可能无法正确堆叠。
- 确保传给
json_encode()的值是整型或浮点型,不是字符串 —— 检查来源:数据库字段类型、$_GET参数需用(int)或floatval()显式转换 - 避免在数组中混用键名:不要一半用数字键(
[120, 80]),一半用字符串键(['线上'=>120]),堆叠配置会失效 - 用
json_last_error()验证输出,特别留意JSON_ERROR_INF或JSON_ERROR_RECURSION(常见于对象未清理循环引用)
真正容易被忽略的是:堆叠行为由前端库的配置项控制(如 Chart.js 的 stacked: true),PHP 只负责把对齐、类型正确的数据交出去;合并逻辑写得再漂亮,前端没开堆叠模式,出来的还是并列柱子。











