PHP后端必须返回含完整业务字段的关联数组,如["value"=>120,"user_id"=>1001],禁用array_values()和默认数字索引;ECharts取params.data.xxx,Chart.js v3+用context.raw访问;日期金额需PHP端json_encode(..., JSON_UNESCAPED_UNICODE)确保格式正确。

PHP后端返回数据时tooltip字段缺失
Chart.js、ECharts这类前端图表库的tooltip内容,完全依赖PHP接口返回的数据结构。如果后端没把需要展示的字段(比如用户ID、创建时间、分类名称)一并塞进data数组里,前端再怎么配置formatter也补不回来。
常见表现是:tooltip只显示数值和图例名,点开详情却看不到关联业务信息。
- 确保PHP输出的每个数据项是关联数组,而非仅数值:
["value" => 120, "user_id" => 1001, "category" => "付费用户", "created_at" => "2024-06-15"] - 避免用
array_values()抹掉键名——它会把user_id这种关键字段变成数字索引 - 若用PDO获取数据,记得加
PDO::FETCH_ASSOC参数,否则默认返回数字索引数组
ECharts中自定义tooltip formatter取不到额外字段
ECharts的tooltip.formatter函数接收的params参数,只有在PHP传来的数据对象里明确存在对应key,才能读到。它不会自动从series或option其他位置“猜”字段。
比如PHP返回了"ext_info": "VIP等级: L3",但formatter里写params.value.ext_info就报错——因为params.value只是个数字,真正字段在params.data里。
立即学习“PHP免费学习笔记(深入)”;
- 正确访问方式:
params.data.user_id或params.data['created_at'] - 检查
params结构最简单的方法:在formatter开头加console.log(params) - 如果数据是堆叠图或多系列,
params.data可能是个数组,需先Array.isArray(params.data)判断
Chart.js tooltip callbacks里this._data未定义
Chart.js v3+废弃了this._data这种内部属性访问方式,直接读会导致undefined。tooltip内容必须通过context参数获取原始数据源。
它的context.raw就是PHP传来的那个完整数据项,而context.parsed只是解析后的数值(如y轴值),不含扩展字段。
- 错误写法:
return this._data.datasets[context.datasetIndex].data[context.dataIndex].user_id - 正确写法:
return context.raw.user_id + ' | ' + context.raw.category - 注意:v2和v3的
callbacks签名不同,升级时务必核对文档中context参数结构
中文日期/金额格式在tooltip里显示乱码或科学计数
PHP后端如果直接用date('Y-m-d H:i', $ts)生成字符串,前端一般没问题;但若用number_format()或strftime()处理不当,容易触发JSON序列化异常或被JS误转为数字。
典型问题:金额1000000变成1e+6,或中文冒号被转义成\u6709\u5f85。
- PHP侧统一用
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK)输出,禁用JSON_NUMERIC_CHECK可避免数字被强转(但要自己保证数值类型) - 前端不要对
params.data.created_at再做new Date().toLocaleString()——PHP已格式化好就直接用字符串 - 如果tooltip里要高亮关键词,用
params.data.label.replace(/VIP/g, 'VIP'),但需配合tooltip.enabled: false+tooltip.external自定义DOM渲染
"User_ID",前端写params.data.user_id也拿不到。











